Ansible实战—使用playbook部署lamp

Ansible实战—使用playbook部署lamp

本次环境说明:

系统平台 主机的IP地址 需要安装的服务
redhat8 192.168.110.10 ansible
redhat8 192.168.110.20 httpd
redhat8 192.168.110.30 mysql
redhat8 192.168.110.40 php

准备工作

给Ansible主控机配置yum源(阿里云官方镜像网站

//配置centos源
[root@ansible ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
[root@ansible ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@ansible ~]# sed -i 's|$releasever|8|' /etc/yum.repos.d/CentOS-Base.repo 

//配置epel源
[root@ansible ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@ansible ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@ansible ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@ansible ~]# sed -i 's|$releasever|8|' /etc/yum.repos.d/epel*

//清理yum缓存,建立缓存
[root@ansible ~]# yum clean all
[root@ansible ~]# yum makecach

在Ansible主控机上设置三台受控机

//映射主机名
[root@ansible ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.110.10 ansible
192.168.110.20 httpd
192.168.110.30 mysql
192.168.110.40 php

//修改清单位置
[root@ansible ~]# vim /etc/ansible/ansible.cfg 

# some basic default values...

inventory      = ./inventory

//定义清单
[root@ansible ~]# vim /etc/ansible/inventory 

[web_group]
httpd

[databases_group]
mysql

[app_group]
php

生成密钥,给三台受控机设置免密登录

[root@ansible ~]# ssh-keygen -t rsa     //生成密钥,直接回车即可
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OFB9SUGgUTf2KbgfrEnnDe5vDh0OE2AmqeOjC7UMsqw root@ansible
The key's randomart image is:
+---[RSA 3072]----+
|      ++*+Bo     |
|     ..*.=oo .   |
|    ... ..o o    |
|    o. . o o     |
|o .. .o S B .    |
|o= .o  o B O .   |
|o.o. .  o = +    |
|...      . ..    |
|E ..      .+o    |
+----[SHA256]-----+

//设置主机免密登录
[root@ansible ~]# ssh-copy-id root@httpd   //httpd主机
[root@ansible ~]# ssh-copy-id root@mysql	//mysql主机
[root@ansible ~]# ssh-copy-id root@php	//php主机

测试能否ping通三台受控机

[root@ansible ~]# ansible all -m ping
mysql | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
httpd | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
php | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

创建本次项目的目录

//创建project文件夹
[root@ansible ~]# mkdir /project
[root@ansible ~]# cd /project/
[root@ansible project]# ls
[root@ansible project]# mkdir -p modules/yum/files
[root@ansible project]# mkdir -p modules/webs/apache modules/databases/mysql modules/apps/php

//把配置清单文件拷贝到当前目录,使project目录可以单独使用ansible命令
[root@ansible project]# cp /etc/ansible/ansible.cfg .
[root@ansible project]# cp /etc/ansible/inventory .

//可以ping通
[root@ansible project]# ansible all -m ping
mysql | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
httpd | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
php | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

项目结构

[root@ansible project]# tree .
.
├── ansible.cfg
├── inventory
├── lamp
│   └── lamp.yml
└── modules
    ├── apps
    │   └── php
    │       ├── php_install.yml
    │       └── vars
    │           └── var.yml
    ├── databases
    │   └── mysql
    │       ├── files
    │       │   └── mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
    │       ├── mysql_install.yml
    │       ├── templates
    │       │   ├── my.cnf.j2
    │       │   └── mysqld.service.j2
    │       └── vars
    │           └── var.yml
    ├── webs
    │   └── apache
    │       ├── files
    │       │   ├── apr-1.7.0.tar.gz
    │       │   ├── apr-util-1.6.1.tar.gz
    │       │   └── httpd-2.4.46.tar.bz2
    │       ├── httpd_install.yml
    │       ├── scripts
    │       │   └── install.sh
    │       ├── templates
    │       │   ├── httpd.conf.j2
    │       │   └── httpd.service.j2
    │       └── vars
    │           └── var.yml
    └── yum
        ├── files
        │   ├── Centos6-base.repo
        │   ├── Centos7-base.repo
        │   ├── Centos8-base.repo
        │   ├── epel-6.repo
        │   ├── epel-7.repo
        │   └── epel-8.repo
        └── main.yml

开始部署

给三台受控主机配置yum源

本次使用的是阿里云的网络源

//下载centos源
[root@ansible files]# wget https://mirrors.aliyun.com/repo/Centos-6.repo
[root@ansible files]# wget https://mirrors.aliyun.com/repo/Centos-7.repo
[root@ansible files]# wget https://mirrors.aliyun.com/repo/Centos-8.repo

//下载epel源
[root@ansible files]# wget epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@ansible files]# wget epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@ansible files]# wget epel-release-latest-8.noarch.rpm https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

//查看下载好的源
[root@ansible files]# ls
Centos-6.repo  Centos-8.repo  epel-7.repo
Centos-7.repo  epel-6.repo    epel-release-latest-8.noarch.rpm

//安装centos8的epel的rpm包
[root@ansible files]# rpm -ivh epel-release-latest-8.noarch.rpm 
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
	package epel-release-8-10.el8.noarch is already installed   //因为本机是安装了centos8的epel源

//拷贝到当前目录
[root@ansible files]# cp /etc/yum.repos.d/epel.repo .

//删除centos8的epel源
[root@ansible files]# rm -f epel-release-latest-8.noarch.rpm 

//改名为epel-8.repo
[root@ansible files]# mv epel.repo epel-8.repo

//查看下载好的源
[root@ansible files]# ls
Centos-6.repo  Centos-7.repo  Centos-8.repo  epel-6.repo  epel-7.repo  epel-8.repo

配置centos源

//配置centos源
[root@ansible files]# sed -i 's|$releasever|6|' Centos-6.repo 
[root@ansible files]# sed -i 's|$releasever|7|' Centos-7.repo 
[root@ansible files]# sed -i 's|$releasever|8|' Centos-8.repo 
[root@ansible files]# ls
Centos-6.repo  Centos-7.repo  Centos-8.repo  epel-6.repo  epel-7.repo  epel-8.repo
[root@ansible files]# mv Centos-6.repo Centos6-base.repo
[root@ansible files]# mv Centos-7.repo Centos7-base.repo
[root@ansible files]# mv Centos-8.repo Centos8-base.repo

编写yum的playbook

[root@ansible modules]# vim yum/main.yml 
---
- hosts: all
  tasks:
    - name: CentOS 7_base
      yum_repository:
        name: base
        baseurl: https://mirrors.aliyun.com/centos/7/os/x86_64/
        enabled: yes
        gpgcheck: no
        mode: 0644
        file: base
        description: base
        state: present
      when:
        - ansible_facts["distribution"] == "CentOS"
        - ansible_facts["distribution_major_version"] == "7"

    - name: CentOS 7_epel
      yum_repository:
        name: epel
        description: epel
        file: epel
        baseurl: https://mirrors.aliyun.com/epel/7/x86_64
        gpgcheck: no
        mode: 0644
        state: present
      when:
        - ansible_facts["distribution"] == "CentOS"
        - ansible_facts["distribution_major_version"] == "7"

    - name: yum_RedHat 8 yum_CentOS 8
      loop:
        - AppStream
        - BaseOS
      yum_repository:
        name: "{{ item }}"
        description: "{{ item }}"
        file: "{{ item }}"
        baseurl: https://mirrors.aliyun.com/centos/8/{{ item }}/x86_64/os/
        gpgcheck: no
        mode: 0644
        state: present
      when: >
        ( ansible_facts["distribution"] == "RedHat" and
          ansible_facts["distribution_major_version"] == "8" )
         or
        ( ansible_facts["distribution"] == "CentOS" and
          ansible_facts["distribution_major_version"] == "8" )

    - name: epel_RedHat 8 epel_CentOS 8
      yum_repository:
        name: epel
        description: epel
        file: epel
        baseurl: https://mirrors.aliyun.com/epel/8/Everything/x86_64/
        gpgcheck: no
        mode: 0644
        state: present
      when: >
        ( ansible_facts["distribution"] == "RedHat" and
          ansible_facts["distribution_major_version"] == "8" )
         or
        ( ansible_facts["distribution"] == "CentOS" and
          ansible_facts["distribution_major_version"] == "8" )

    - name: selinux
      lineinfile:
        path: /etc/selinux/config
        regexp: '^SELINUX='
        line: SELINUX=disabled

    - name: set selinux
      command: setenforce 0

安装apache

下载需要的软件包

//当前目录的位置
[root@ansible files]# pwd
/project/modules/webs/apache/files

//开始下载,可以使用wget下载,也可以使用xftp传进来
[root@ansible files]# wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.7.0.tar.gz
[root@ansible files]# wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
[root@ansible files]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2

//查看
[root@ansible files]# ls
apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz  httpd-2.4.46.tar.bz2

配置变量的yml文件

//创建vars目录
[root@ansible apache]# mkdir vars

//编写var.yml
[root@ansible apache]# vim vars/var.yml
depend_pkg:
   - "@Development Tools"
   - openssl-devel
   - pcre-devel
   - expat-devel
   - libxml2-devel
   - libtool
   - gcc
   - gcc-c++
   - bzip2
   - make

编写安装脚本

//创建存放脚本的目录
[root@ansible apache]# mkdir scripts

//编写安装脚本的批处理
[root@ansible apache]# vim scripts/install.sh 
#!/bin/bash

if [ ! -d /usr/local/apache ];then
rm -rf /usr/local/apr*

# uzip 
cd /usr/src
tar xf apr-1.7.0.tar.gz
tar xf apr-util-1.6.1.tar.gz
tar xf httpd-2.4.46.tar.bz2
cd apr-1.7.0
sed -i '/$RM "$cfgfile"/d' configure

# install apr
./configure --prefix=/usr/local/apr && make && make install && 
cd ../apr-util-1.6.1

# install apr-util
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && 
make && make install && 
cd ../httpd-2.4.46

# install httpd
./configure --prefix=/usr/local/apache 
        --sysconfdir=/etc/httpd24 
        --enable-so 
        --enable-ssl 
        --enable-cgi 
        --enable-rewrite 
        --with-zlib 
        --with-pcre 
        --with-apr=/usr/local/apr 
        --with-apr-util=/usr/local/apr-util/ 
        --enable-modules=most 
        --enable-mpms-shared=all 
        --with-mpm=prefork && 
        make && make install

# echo path
echo 'export PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/apache.sh

cd /usr/src
rm -rf apr-1.7.0 apr-util-1.6.1 httpd-2.4.46
fi

编辑httpd.service.j2模板文件

[root@ansible apache]# vim templates/httpd.service.j2 

[Unit]
Description=Start httpd

[Service]
Type=forking
ExecStart=/usr/local/apache/bin/apachectl
ExecReload=/usr/local/apache/bin/apachectl -s reload
ExecStop=/usr/local/apache/apachectl -s stop

[Install]
WantedBy=multi-user.target

编写apache的playbook

[root@ansible apache]# vim httpd_install.yml 
---
- hosts: httpd
  vars_files:
    - vars/var.yml
  tasks:
    - name: install depend on apache
      yum:
        name: "{{ depend_pkg }}"
        state: present

    - name: create user apache
      user:
        name: apache
        shell: /sbin/nologin
        create_home: false
        system: yes
        state: present

    - name: download packages
      copy:
        src: files/
        dest: /usr/src

    - name: install apache
      script: scripts/install.sh

    - name: start the service
      template:
        src: templates/httpd.service.j2
        dest: /usr/lib/systemd/system/httpd.service

    - name: reload daemon for httpd
      shell: systemctl daemon-reload 

编辑httpd.conf.j2模板文件

[root@ansible apache]# vim templates/httpd.conf.j2
//搜索AddType
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php           //添加此行
    AddType application/x-httpd-php-source .phps       //添加此行
  
//搜索proxy.so
#LoadModule remoteip_module modules/mod_remoteip.so
LoadModule proxy_module modules/mod_proxy.so                  //取消注释
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so      //取消注释

//搜索index.html
DirectoryIndex index.php  index.html #添加index.php

//在最后一行加上如下配置
<VirtualHost *:80>
    DocumentRoot "/usr/local/apache/htdocs/"
    ServerName leidazhuang.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*.php)$ fcgi://192.168.110.40:9000/var/www/html/$1
    <Directory "/usr/local/apache/htdocs/">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>

安装mysql

下载需要的包

//当前目录的位置
[root@ansible files]# pwd
/project/modules/databases/mysql/files

//下载包
[root@ansible files]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

//查看一下
[root@ansible files]# ls
mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

配置变量的yml文件

//创建vars目录
[root@ansible mysql]# mkdir vars

//编写var.yml文件
[root@ansible mysql]# vim vars/var.yml 

basedir: /usr/local
datadir: /opt/data
depend_pkg:
  - ncurses-compat-libs
  - ncurses-devel
  - openssl-devel
  - openssl
  - cmake
  - mariadb-devel
  - ncurses-compat-libs

编辑my.cnf.j2模板文件

[root@ansible mysql]# vim templates/my.cnf.j2 

[mysqld]
basedir = {{ basedir }}/mysql
datadir = {{ datadir }}
socket = /tmp/mysql.sock
port = 3306
pid-file = {{ datadir }}/mysql.pid
user = mysql
skip-name-resolve

编辑mysqld.service.j2模板文件

[root@ansible mysql]# vim templates/mysqld.service.j2 

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile={{ datadir }}/mysqld.pid
TimeoutSec=0
PermissionsStartOnly=true
ExecStart={{ basedir }}/mysql/bin/mysqld --daemonize --pid-file={{ datadir }}/mysqld.pid $MYSQLD_OPTS
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

编写mysql的playbook

[root@ansible mysql]# vim mysql_install.yml 

---
- hosts: mysql
  vars_files:
    - vars/var.yml
  tasks:
    - name: install depend on mysql
      yum:
        name: "{{ depend_pkg }}"
        state: present

    - name: create user mysql
      user:
        name: mysql
        system: yes
        create_home: false
        shell: /sbin/nologin
        state: present

    - name: unzip package
      unarchive:
        src: files/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
        dest: '{{ basedir }}/'
        owner: mysql
        group: mysql

    - name: create soft link
      file:
        src: '{{ basedir }}/mysql-5.7.31-linux-glibc2.12-x86_64'
        dest: '{{ basedir }}/mysql'
        owner: mysql
        group: mysql
        state: link

    - name: create datadir
      file:
        path: '{{ datadir }}'
        owner: mysql
        group: mysql
        state: directory

    - name: initialize mysql
      shell: '{{ basedir }}/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir={{ datadir }}'
      ignore_errors: yes

    - name: config for mysql
      template:
        src: templates/my.cnf.j2
        dest: /etc/my.cnf

    - name: start the service
      template:
        src: templates/mysqld.service.j2
        dest: /usr/lib/systemd/system/mysqld.service

    - name: reload daemon for mysql
      shell: systemctl daemon-reload

安装php

配置变量的配置文件

[root@ansible php]# vim vars/var.yml 

packages:
  - libxml2
  - libxml2-devel
  - openssl
  - openssl-devel
  - bzip2
  - bzip2-devel
  - libcurl
  - libcurl-devel
  - libicu-devel
  - libjpeg
  - libjpeg-devel
  - libpng
  - libpng-devel
  - openldap-devel
  - pcre-devel
  - freetype
  - freetype-devel
  - gmp
  - gmp-devel
  - libmcrypt
  - libmcrypt-devel
  - readline
  - readline-devel
  - libxslt
  - libxslt-devel
  - mhash
  - mhash-devel
  - php-mysqlnd
  - php-*

编写php的playbook

[root@ansible php]# vim php_install.yml 

---
- hosts: php
  vars_files:
    - vars/var.yml
  tasks:
      - name: install package
        dnf:
          name: '{{ packages }}'
          state: present

      - name: set conf
        lineinfile:
          path: /etc/php-fpm.d/www.conf
          regexp: '^listen = /run/php-fpm/www.sock'
          line: 'listen = 0.0.0.0:9000'
          state: present

注意:以上都是通用型配置,下面我们要单独部署lamp项目

部署lamp项目

编写lamp项目的架构和playbook

---
- name: yum part
  import_playbook: ../modules/yum/main.yml

- name: httpd part
  import_playbook: ../modules/webs/apache/httpd_install.yml

- name: mysql part
  import_playbook: ../modules/databases/mysql/mysql_install.yml

- name: php part
  import_playbook: ../modules/apps/php/php_install.yml

- hosts: httpd
  vars_files:
    - ../modules/webs/apache/vars/var.yml
  tasks:
    - name: httpd config file
      template:
        src: ../modules/webs/apache/templates/httpd.conf.j2
        dest: /etc/httpd24/httpd.conf

    - name: start httpd
      service:
        name: httpd
        enabled: yes
        state: started

- hosts: mysql
  vars_files:
    - ../modules/databases/mysql/vars/var.yml
  tasks:
    - name: start mysql
      service:
        name: mysqld
        enabled: yes
        state: started

- hosts: php
  tasks:
    - name: index.php
      file:
        path: /var/www/html/index.php
        owner: apache
        group: apache
        state: touch

    - name: test index
      lineinfile:
        path: /var/www/html/index.php
        line: |
            <?php
            phpinfo();
            ?>
        state: present

    - name: allow access to IP
      lineinfile:
        path: /etc/php-fpm.d/www.conf
        regexp: '^listen.allowed_clients = 127.0.0.1'
        line: listen.allowed_clients = 192.168.110.20

    - name: start php
      service:
        name: php-fpm
        state: started
        enabled: yes

运行lamp的剧本文件

[root@ansible project]# ansible-playbook lamp/lamp.yml 

PLAY [all] *************************************************************************

TASK [Gathering Facts] *************************************************************
ok: [php]
ok: [httpd]
ok: [mysql]

TASK [CentOS 7_base] ***************************************************************
skipping: [httpd]
skipping: [mysql]
skipping: [php]

TASK [CentOS 7_epel] ***************************************************************
skipping: [httpd]
skipping: [mysql]
skipping: [php]

TASK [yum_RedHat 8 yum_CentOS 8] ***************************************************
changed: [mysql] => (item=AppStream)
changed: [httpd] => (item=AppStream)
changed: [php] => (item=AppStream)
changed: [mysql] => (item=BaseOS)
changed: [php] => (item=BaseOS)
changed: [httpd] => (item=BaseOS)

TASK [epel_RedHat 8 epel_CentOS 8] *************************************************
changed: [httpd]
changed: [php]
changed: [mysql]

TASK [stop firewalld] **************************************************************
changed: [php]
changed: [mysql]
changed: [httpd]

TASK [selinux] *********************************************************************
changed: [php]
changed: [mysql]
changed: [httpd]

TASK [set selinux] *****************************************************************
changed: [mysql]
changed: [httpd]
changed: [php]

PLAY [httpd] ***********************************************************************

TASK [Gathering Facts] *************************************************************
ok: [httpd]

TASK [install depend on apache] ****************************************************
changed: [httpd]

TASK [create user apache] **********************************************************
changed: [httpd]

TASK [download packages] ***********************************************************
changed: [httpd]

TASK [install apache] **************************************************************
changed: [httpd]

TASK [start the service] ***********************************************************
changed: [httpd]

TASK [reload daemon for httpd] *****************************************************
changed: [httpd]

PLAY [mysql] ***********************************************************************

TASK [Gathering Facts] *************************************************************
ok: [mysql]

TASK [install depend on mysql] *****************************************************
changed: [mysql]

TASK [create user mysql] ***********************************************************
changed: [mysql]

TASK [unzip package] ***************************************************************
changed: [mysql]

TASK [create soft link] ************************************************************
changed: [mysql]

TASK [create datadir] **************************************************************
changed: [mysql]

TASK [initialize mysql] ************************************************************
changed: [mysql]

TASK [config for mysql] ************************************************************
changed: [mysql]

TASK [start the service] ***********************************************************
changed: [mysql]

TASK [reload daemon for mysql] *****************************************************
changed: [mysql]

PLAY [php] *************************************************************************

TASK [Gathering Facts] *************************************************************
ok: [php]

TASK [install package] *************************************************************
changed: [php]

TASK [set conf] ********************************************************************
changed: [php]

PLAY [httpd] ***********************************************************************

TASK [Gathering Facts] *************************************************************
ok: [httpd]

TASK [httpd config file] ***********************************************************
changed: [httpd]

TASK [start httpd] *****************************************************************
changed: [httpd]

PLAY [mysql] ***********************************************************************

TASK [Gathering Facts] *************************************************************
ok: [mysql]

TASK [start mysql] *****************************************************************
changed: [mysql]

PLAY [php] *************************************************************************

TASK [Gathering Facts] *************************************************************
ok: [php]

TASK [index.php] *******************************************************************
changed: [php]

TASK [test index] ******************************************************************
changed: [php]

TASK [allow access to IP] **********************************************************
changed: [php]

TASK [start php] *******************************************************************
changed: [php]

PLAY RECAP *************************************************************************
httpd                      : ok=16   changed=13   unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
mysql                      : ok=18   changed=15   unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
php                        : ok=14   changed=11   unreachable=0    failed=0    skipped=2    rescued=0    ignored=0  

在三台受控机上验证一下

httpd主机

[root@localhost ~]# ss -antl
State     Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    
LISTEN    0          128                  0.0.0.0:22                0.0.0.0:*       
LISTEN    0          128                  0.0.0.0:80                0.0.0.0:*       
LISTEN    0          128                     [::]:22                   [::]:* 

mysql主机

[root@localhost ~]# ss -antl
State     Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    
LISTEN    0          128                  0.0.0.0:22                0.0.0.0:*       
LISTEN    0          128                     [::]:22                   [::]:*       
LISTEN    0          80                         *:3306                    *:*

php主机

[root@localhost ~]# ss -antl
State     Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    
LISTEN    0          128                  0.0.0.0:9000              0.0.0.0:*       
LISTEN    0          128                  0.0.0.0:22                0.0.0.0:*       
LISTEN    0          128                     [::]:22                   [::]:* 

测试网页

原文地址:https://www.cnblogs.com/leixixi/p/14258568.html