【Ansible】构建LAMP环境
一个选择是:目标
使用Ansible自动创建LAMP环境(使用AWS EC2)。
首先
我们根据以下网站作为参考,在本文中进行了构建。
让我们在EC2环境中使用Ansible进行操作
尝试使用Ansible首次创建LAMP环境
有关Ansible的内容
有关Ansible的基本知识,请参考以下网站,其中有易于理解的说明。
Ansible实践入门
假设
・确保已经创建了两个已配置的Anisble执行元和执行目标的EC2实例(使用Amazon Linux 2 AMI (HVM),SSD卷类型)。
※本文中将分别使用执行源实例和执行目标实例来表示各个实例。
※请在执行目标实例的安全组中允许80端口。
工作进程
步骤
1. 安装Ansible
在原始实例中安装Ansible。
当在Amazon Linux上执行”sudo yum install ansible”命令时,被告知需要使用额外的软件包。
[ec2-user@ip-172-31-42-36 ~]$ sudo yum install ansible
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
No package ansible available.
Error: Nothing to do
ansible is available in Amazon Linux Extra topic "ansible2"
To use, run
# sudo amazon-linux-extras install ansible2
Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras
使用提到的sudo amazon-linux-extras install ansible2命令来进行安装。
sudo amazon-linux-extras install ansible2
确认版本信息并检查是否已经安装。
# バージョンが表示されること
ansible --version
2. 开通SSH功能
在执行Ansible时,执行源和执行目标主机之间需要通过ssh进行通信。
使用TeraTarm的功能,将用于目标实例的密钥对部署到执行源实例(在/home/ec2-user/.ssh目录下)。

在使用密钥对时,必须限制仅允许拥有者用户访问密钥。
cd /home/ec2-user/.ssh
chmod 600 <キーペア名>
执行ssh访问。
# 実行先インスタンスにログイン出来ること
ssh -i <キーペア名> <実行先インスタンスのプライベートIPアドレス>
3. 创建库存清单
在清单(Ansible执行列表)中定义执行目标服务器的IP地址和组变量。
首先,切換到Ansible所在的目錄/etc/ansible。
cd /etc/ansible/
[ec2-user@ip-172-31-42-36 ansible]$ ls -l
total 24
-rw-r--r-- 1 root root 19985 Sep 15 17:11 ansible.cfg
-rw-r--r-- 1 root root 1016 Sep 15 17:11 hosts
drwxr-xr-x 2 root root 6 Sep 15 17:11 roles
由于已经存在名为hosts的清单文件,因此将使用该文件(清单文件的名称实际上可以自由选择)。
这次将把执行目标实例归属到名为client_node的组中,
并在该组的变量(通过[组名:vars]来定义)中定义ssh用户名和密钥对的路径。
通过定义组变量,可以在运行Ansible时省略指定ssh用户和密钥对的参数。
请将<实例的私有IP地址>和<密钥名称>互换。
sudo vi hosts
[client_node]
Clinet01 ansible_ssh_host=<実行先インスタンスのプライベートIPアドレス>
[client_node:vars]
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=/home/ec2-user/.ssh/<キーペア名>
4. 编辑Ansible配置文件
在Ansible的配置文件ansible.cfg中,将/etc/ansible/hosts文件设置为清单文件进行配置。只需在相关位置进行记录。
sudo vim ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
5. 制作Playbook
在Playbook中定义执行主机的配置信息。
sudo vi playbook.yml
- hosts: client_node
# sudoで処理実行
become: true
tasks:
# httpdのインストールと起動、及び自動起動有効化
- name: install httpd
yum: name=httpd state=latest
- name: apache start / enable
service: name=httpd state=started enabled=yes
# MySQLリポジトリのインストール、MySQLのインストールと起動、及び自動起動有効化
- name: install mysql repository
yum: name=https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm state=present
- name: install mysql
yum: name=mysql-community-server state=latest
- name: mysql start / enable
service: name=mysqld state=started enabled=yes
# PHP関連パッケージのインストール(複数パッケージをインストールするためitemとwith_itemsを利用してリスト化)し、後続処理としてhttpdを再起動(notifyでhandlersに定義された内容を実行)
- name: install php
yum: name={{item}} state=latest
with_items:
- php
- php-devel
- php-mbstring
- php-mysql
- php-gd
notify:
- httpd restart
# テスト用のhtmlとPHPスクリプトをコピー
- name: html copy
copy:
src: /etc/ansible/test.html
dest: /var/www/html
- name: php copy
copy:
src: /etc/ansible/test.php
dest: /var/www/html
handlers:
- name: httpd restart
service: name=httpd state=restarted
在/etc/ansible目录下创建用于测试的HTML文件和PHP脚本。
sudo vi test.html
TEST HTML
sudo vi test.php
<?php
echo "hoge";
?>
5. 执行Ansible
使用ansible-playbook命令,将在Playbook中定义的配置信息应用于目标实例。
ansible-playbook playbook.yml
预计的输出内容如下:
“ok”表示没有更改配置信息,”changed”表示配置信息已经成功更改。
[ec2-user@ip-172-31-42-36 ansible]$ ansible-playbook playbook.yml
PLAY [client_node] ******************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
[WARNING]: Platform linux on host Clinet01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [Clinet01]
TASK [install httpd] ****************************************************************************************************************************************
changed: [Clinet01]
TASK [apache start / enable] ********************************************************************************************************************************
changed: [Clinet01]
TASK [install mysql repository] *****************************************************************************************************************************
changed: [Clinet01]
TASK [install mysql] ****************************************************************************************************************************************
changed: [Clinet01]
TASK [mysql start / enable] *********************************************************************************************************************************
changed: [Clinet01]
TASK [install php] ******************************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and
specifying `name: "{{item}}"`, please use `name: ['php', 'php-devel', 'php-mbstring', 'php-mysql', 'php-gd']` and remove the loop. This feature will be
removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
changed: [Clinet01] => (item=[u'php', u'php-devel', u'php-mbstring', u'php-mysql', u'php-gd'])
TASK [html copy] ********************************************************************************************************************************************
changed: [Clinet01]
TASK [php copy] *********************************************************************************************************************************************
changed: [Clinet01]
PLAY RECAP **************************************************************************************************************************************************
Clinet01 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
6. 确认连接
为了确认Apache、PHP和MySQL是否在目标服务器上正常运行,我将进行检查。
请从浏览器中访问以下网址,如果正确显示页面,则表示连接Apache和PHP成功:
http://运行实例的全局IP地址/test.html
http://运行实例的全局IP地址/test.php


②确认MySQL连接
登录到目标实例的ssh
cd /home/ec2-user/.ssh
ssh -i <キーペア名> <実行先インスタンスのプライベートIPアドレス>
确认MySQL的root用户初始密码
sudo cat /var/log/mysqld.log | grep root
出力行末尾的随机字符串是初始密码。
2021-01-02T09:00:48.846281Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: gkSv.>n<0sF<
执行命令 mysql -u root -p 并输入先前确认的初始密码,如果成功登录,则表示正常。
[ec2-user@ip-172-31-42-226 ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.22
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>