【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目录下)。

image.png

在使用密钥对时,必须限制仅允许拥有者用户访问密钥。

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

image.png
image.png

②确认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>
bannerAds