• 自动化运维:Ansible之playbook基于ROLES部署LNMP平台


    目录

    一、理论

    1.playbook剧本

    2.ROLES角色

    3.关系

    4.Roles模块搭建LNMP架构

    二、实验

    1.Roles模块搭建LNMP架构

    三、问题

    1.剧本启动php报错语法问题

    2.剧本启动mysql报错语法问题

    3.剧本启动nginx开启失败

    4.剧本安装php失败

    5.使用yum时报错

    6.rpm -Uvh https://xxxx.rpm 提示连接失败问题

    7.依赖检测失败

    8.剧本修改php失败

    9.剧本启动php失败

    10.剧本修改mysql脚本文件失败


    一、理论

    1.playbook剧本

    (1)架构

    1. vim XXX.yaml
    2. - name: #指定play名称
    3. hosts: #指定主机组
    4. remote_user: #执行用户
    5. gather_facts: true|false #是否收集远程主机facts信息
    6. vars: #定义变量
    7. tasks: #定义task任务列表
    8. - name: #定义task任务名称
    9. 模块: #定义任务使用的模块和参数
    10. with_items: #定义循环列表
    11. when: #定义判断条件(== != >= > <= <),true则执行任务,否则不执行任务
    12. ignore_errors: true #忽略任务失败
    13. notify: #定义task任务changed状态时触发的任务名
    14. tags: #指定标签,ansible-playbook --tags 仅执行拥有指定 tags 标签的任务(always标签总会执行)
    15. handlers: #定义notify触发的任务列表

    (2)核心元素

     (3)参数

    2.ROLES角色

    (1)重构思路

    用roles和不用roles的逻辑其实是一样的,要根据服务器的功能,先收集服务器所需要的文件,再进行安装,传输文件,启动服务或重启服务等操作。只是我们这次不必担心命名问题,因为不同的服务或不同功能的服务器所需要的配置文件会被放到不同的目录,不会冲突。

    roles这个角色,可以根据同类服务器的功能定义,也可以通过服务去定义,因为我们是一键部署所有服务和项目,也不存在指定部署服务的需求,如果通过服务来定义,也容易出现需要很多when判断的情况,如果用同类功能的服务器定义角色,可能会出现同一条命令需要反复编写的情况,自行选择,我采取根据同类功能服务器去定义我们的roles角色。

    (2)目录结构

    (3)目录说明

    3.关系

    playbook是是由一系列的play组成, 每个play由一个或者多个task组成, 一个task一般是一个ansible module, 三者的关系示意图如下:

    4.Roles模块搭建LNMP架构


    (1)规划

    通过ansible的roles角色去配置lnmp环境,nginx、php、mysql都使用源码编译安装

    (2)架构

     (3)部署Nginx角色

    创建nginx角色所需要的工作目录:

    1. mkdir -p /etc/ansible/playbook/roles/nginx
    2. mkdir -p /etc/ansible/playbook/roles/nginx/defaults
    3. mkdir -p /etc/ansible/playbook/roles/nginx/files
    4. mkdir -p /etc/ansible/playbook/roles/nginx/handlers
    5. mkdir -p /etc/ansible/playbook/roles/nginx/meta
    6. mkdir -p /etc/ansible/playbook/roles/nginx/tasks
    7. mkdir -p /etc/ansible/playbook/roles/nginx/templates
    8. mkdir -p /etc/ansible/playbook/roles/nginx/vars

    制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

    1. vim /etc/ansible/playbook/roles/nginx/files/index.php
    2. phpinfo();
    3. ?>

    制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

    1. vim /etc/ansible/playbook/roles/nginx/files/nginx.repo
    2. # nginx.repo
    3. [nginx]
    4. name=nginx repo
    5. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    6. gpgcheck=1
    7. enabled=1
    8. gpgkey=https://nginx.org/keys/nginx_signing.key
    9. module_hotfixes=true

    制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

    1. vim /etc/ansible/playbook/roles/nginx/handlers/main.yml
    2. - name: reload nginx
    3. service: name={{service}} state=reloaded

    制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

    1. vim /etc/ansible/playbook/roles/nginx/tasks/init.yml
    2. - name: disable firewalld
    3. service: name=firewalld state=stopped enabled=no
    4. ignore_errors: True
    5. - name: disable selinux
    6. shell: "/usr/sbin/setenforce 0"
    7. ignore_errors: true

    制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

    1. - include: "init.yml"
    2. - name: copy nginx yum repo file
    3. copy: src=nginx.repo dest=/etc/yum.repos.d/
    4. - name: install nginx
    5. yum: name={{pkg}} state=latest
    6. - name: copy index.php
    7. copy: src=index.php dest={{root_dir}}
    8. - name: copy nginx template configuration file
    9. template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
    10. notify: reload nginx
    11. - name: start nginx
    12. service: name={{service}} state=started enabled=yes

    制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

    1. vim /etc/ansible/playbook/roles/nginx/templates/default.conf.j2
    2. ---修改2到8行-----------
    3. listen {{http_port}};
    4. server_name {{http_hostname}};
    5. #access_log /var/log/nginx/host.access.log main;
    6. location / {
    7. root {{root_dir}};
    8. ---修改29到36行-----------
    9. location ~ \.php$ {
    10. root {{root_dir}};
    11. fastcgi_pass {{http_remote}};
    12. fastcgi_index index.php;
    13. fastcgi_param SCRIPT_FILENAME {{root_dir}}$fastcgi_script_name;
    14. include fastcgi_params;
    15. }

    制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

    1. http_port: 192.168.204.69:80
    2. http_hostname: www.david.com
    3. root_dir: /usr/share/nginx/html
    4. http_remote: 192.168.204.100:9000
    5. pkg: nginx
    6. service: nginx

    (4) 部署PHP角色

    创建php角色所需要的工作目录:

    1. mkdir -p /etc/ansible/playbook/roles/php
    2. mkdir -p /etc/ansible/playbook/roles/php/defaults
    3. mkdir -p /etc/ansible/playbook/roles/php/files
    4. mkdir -p /etc/ansible/playbook/roles/php/handlers
    5. mkdir -p /etc/ansible/playbook/roles/php/meta
    6. mkdir -p /etc/ansible/playbook/roles/php/tasks
    7. mkdir -p /etc/ansible/playbook/roles/php/templates
    8. mkdir -p /etc/ansible/playbook/roles/php/vars

    制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

    1. vim /etc/ansible/playbook/roles/php/files/index.php
    2. phpinfo();
    3. ?>

    制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

    1. vim /etc/ansible/playbook/roles/php/handlers/main.yml
    2. - name: reload php
    3. service: name={{service}} state=reloaded

    制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

    1. /etc/ansible/playbook/roles/php/tasks]# vim main.yml
    2. - name: install yum repo
    3. shell: "rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm"
    4. ignore_errors: True
    5. - name: install php
    6. command: 'yum install -y php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml p hp72w-fpm php72w-mysqlnd php72w-opcache --skip-broken'
    7. - name: create php user
    8. user: name={{user_name}}
    9. - name: crate web root dir
    10. file: name={{root_dir}} state=directory
    11. - name: copy index.php
    12. copy: src=index.php dest={{root_dir}}
    13. - name: modify php configuration file
    14. replace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"
    15. notify: reload php
    16. - name: modify username and groupname in www.conf
    17. replace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}"
    18. notify: reload php
    19. - name: modify listen addr in www.conf
    20. replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1:9000" replace="{{http_port}}"
    21. notify: reload php
    22. - name: modify allowed client in www.conf
    23. replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{remote_addr}}"
    24. notify: reload php
    25. - name: start php
    26. service: name={{service}} state=started enabled=yes

    制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

    1. vim /etc/ansible/playbook/roles/php/vars/main.yml
    2. timezone: Asia/Shanghai
    3. user_name: php
    4. http_port: 192.168.204.100:9000
    5. remote_addr: 192.168.204.69
    6. root_dir: /usr/share/nginx/html
    7. service: php-fpm

    (5) 部署MySQL角色

    创建mysql角色所需要的工作目录:

    1. mkdir -p /etc/ansible/playbook/roles/mysql
    2. mkdir -p /etc/ansible/playbook/roles/mysql/defaults
    3. mkdir -p /etc/ansible/playbook/roles/mysql/files
    4. mkdir -p /etc/ansible/playbook/roles/mysql/handlers
    5. mkdir -p /etc/ansible/playbook/roles/mysql/meta
    6. mkdir -p /etc/ansible/playbook/roles/mysql/tasks
    7. mkdir -p /etc/ansible/playbook/roles/mysql/templates
    8. mkdir -p /etc/ansible/playbook/roles/mysql/vars

    制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

    1. vim /etc/ansible/playbook/roles/mysql/handlers/main.yml
    2. - name: reload mysql
    3. service: name={{service}} state=reloaded

    制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

    1. vim /etc/ansible/playbook/roles/mysql/tasks/main.yml
    2. - name: remove mariadb
    3. shell: yum remove mariadb* -y
    4. ignore_errors: True
    5. - name: install yum repo
    6. shell: "wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm --force --nodeps && rpm -ivh mysql57-commu nity-release-el7-11.noarch.rpm --force --nodeps"
    7. ignore_errors: True
    8. - name: modify gpgcheck
    9. replace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0"
    10. - name: install mysql
    11. yum: name=mysql-server state=latest
    12. - name: start mysql
    13. service: name={{service}} state=started enabled=yes
    14. - name: make passwd.sh
    15. script: /etc/ansible/playbook/roles/mysql/files/passwd.sh

    制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

    1. vim /etc/ansible/playbook/roles/mysql/vars/main.yml
    2. service: mysqld.service

    (5)启动安装分布式LNMP

    1. vim /etc/ansible/playbook/lnmp.yml
    2. - name: nginx play
    3. hosts: webservers
    4. remote_user: root
    5. roles:
    6. - nginx
    7. - name: php play
    8. hosts: phpservers
    9. remote_user: root
    10. roles:
    11. - php
    12. - name: mysql play
    13. hosts: mysqlservers
    14. remote_user: root
    15. roles:
    16. - mysql

    二、实验


    1.Roles模块搭建LNMP架构

    (1)环境

    表1 主机

    主控端192.168.204.199ansible
    受控端-1192.168.204.69nginx
    受控端-2192.168.204.186mysql
    受控端-3192.168.204.100php

    (2) 配置主机

     

     (3)部署Nginx角色

    创建nginx角色所需要的工作目录:

     

    制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

     制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

    制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

     制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

    制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

    制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

     制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

    (4) 部署PHP角色

    创建php角色所需要的工作目录:

     

    制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

     制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

    制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

     

    制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

    (5) 部署MySQL角色

    创建mysql角色所需要的工作目录:

     ​​​​​​​注意:需要提前创建passwd.sh

     制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

      制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

     制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

     (6)启动安装分布式LNMP

     启动:

    nginx启动成功

    php启动成功:

    mysql启动成功:

    访问浏览器成功


    三、问题

    1.剧本启动php报错语法问题

    (1)报错

     (2)原因分析

    左端代码未对齐

    (3)解决方法

    修改前

    修改后 

    2.剧本启动mysql报错语法问题

     (1) 报错

     (2)原因分析

    左端代码未对齐

    (3)解决方法

    修改前

    修改后

    3.剧本启动nginx开启失败

    (1)报错

    (2)原因分析

    nginx端查询

    default.conf.j2 配置错误 

    未知的地址池

    (3)解决方法

    nginx端先移除多余配置文件

    ansible端修改配置文件:

    修改前:

    修改后:

    4.剧本安装php失败

    (1) 报错

    (2)原因分析

    [弃用警告]:只在通过squash_actions使用循环时调用“yum”一次是不赞成的。而不是如果使用循环提供多个项目并指定' name: "{{ item }}" ',请使用' name: '{{ ... }}' '并删除循环。这个特性将在2.11版本中删除。弃用的警告可以通过在ansible.cfg中设置deprecation_warnings=False来禁用。
     

    (3)解决方法

    这里先暂不修改yml文件

    修改php端网卡:

    关闭防火墙和安全机制

    如还是报错,修改/etc/ansible/playbook/roles/php/tasks/main.yml文件,安装方式不采用with_items方式,直接以command模块方式运行

    修改前:

    修改后:

    成功

    5.使用yum时报错

    (1)报错

    遇见failure: repodata/repomd.xml from base: [Errno 256]错误

    (2)原因分析

    yum源

    (3)解决方法

    更新依赖包,重新安装发现没用

    1. yum clean all
    2. yum install -y epel-release

    更新ca-certficates包

    1. yum clean all
    2. yum --disablerepo=epel -y update ca-certificates

    将https转为http

    1. cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
    2. sed -i 's#https://#http://#g' /etc/yum.repos.d/epel.repo

    更改resolv.conf文件,然后重启network服务:service network restart

    1. nameserver 8.8.8.8
    2. search localdomain

    以上步骤执行完成后如果仍然失败,继续执行以下步骤:

    查看yum的依赖包

    1. [root@localhost yum.repos.d]# rpm -qa|grep yum
    2. PackageKit-yum-1.1.10-2.el7.centos.x86_64
    3. yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch
    4. yum-langpacks-0.4.2-7.el7.noarch
    5. yum-metadata-parser-1.1.4-10.el7.x86_64
    6. yum-utils-1.1.31-54.el7_8.noarch
    7. yum-3.4.3-168.el7.centos.noarch

    删除依赖包

    [root@localhost yum.repos.d]#  rpm -e yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64 yum-3.4.3-168.el7.centos.noarch
    

    将系统默认的yum功能删除

    [root@localhost yum.repos.d]# rpm -aq|grep yum|xargs rpm -e --nodeps

    查看本版和系统的位数

    1. [root@localhost yum.repos.d]# cat /etc/centos-release
    2. CentOS Linux release 7.9.2009 (Core)

    1. [root@localhost yum.repos.d]# file /bin/ls
    2. /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped

    下载yum包

    1. # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
    2. # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
    3. # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm




    注意:要注意版本
    在http://mirrors.kernel.org/centos/ 或者 http://mirrors.163.com/centos/里下载
    下载完成执行以下命令

    1. # rpm -ivh --nodeps yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
    2. # rpm -ivh  --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64.rpm 
    3. # rpm -ivh --nodeps yum-3.4.3-132.el7.centos.0.1.noarch.rpm




    进入 /etc/yum.repos.d/目录中,在http://mirrors.163.com/.help/centos.html,在里面下载对应版本的repo文件,我下载了CentOS-Base.repo
    对此文件进行备份,以防修改错误还有的用
    修改$releasever为自己的版本号(我的为7)
    保存退出

    6.rpm -Uvh https://xxxx.rpm 提示连接失败问题

    (1)报错

    (2)原因分析

    域名解析失败

    (3)解决方法

    查询IP地址

    通过What Is My IP Address? Free IP Lookup查询对应url ip地址:

    修改hosts 文件,追加一下内容

    1. vim /etc/hosts
    2. 45.55.104.9(ip) webtatic.com(可自定义)

    重新执行命令,访问对应地址成功

    7.依赖检测失败

    (1)报错

    "警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY\n\t软件包 epel-release-7-14.noarch 已经安装", "stderr_lines": ["警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY"

    (2)原因分析

    未忽视依赖关系

    (3)解决方法

    在后面加上--force --nodeps就可以了,nodeps的意思是忽视依赖关系。

    1. rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm --force --nodeps && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --force --nodeps
    2. // 以上是我个人下载的erlang版本,要依据你们自己下载的版本改一下

    修改前:

    修改后:

    成功

    8.剧本修改php失败

    (1)报错

    www.conf文件不存在

    (2)原因分析

    缺失文件

    (3)解决方法

    新建目录并上传文件

    成功

    9.剧本启动php失败

    (1)报错

    ansible端

    php端:

    Failed to start php-fpm.service: Unit not found

    (2)原因分析

    系统中没有配置 php-fpm.service 文件

    (3)解决方法

    通过find / -name nginx.service 找到nginx.service 配置文件路径

    1. [root@localhost php-fpm.d]# find /lib/systemd/system -name "php-fpm.service"
    2. [root@localhost php-fpm.d]# find /etc/systemd/system -name "php-fpm.service"
    3. /etc/systemd/system/php-fpm.service

    创建软链接

    [root@localhost php-fpm.d]# sudo ln -s /lib/systemd/system/php-fpm.service /etc/systemd/system/php-fpm.service
    

    然后去到那个路径 新建一个php-fpm.service文件 保存下面这一段内容,php-fpm路径根据自己的实际情况修改

    1. [Unit]
    2. Description=The PHP FastCGI Process Manager
    3. After=syslog.target network.target
    4. [Service]
    5. Type=simple
    6. PIDFile=/run/php-fpm.pid
    7. ExecStart=/usr/local/php/sbin/php-fpm(你的php-fpm路径) --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf(你的php-fpm配置文件路径)
    8. ExecReload=/bin/kill -USR2 $MAINPID
    9. ExecStop=/bin/kill -SIGINT $MAINPID
    10. [Install]
    11. WantedBy=multi-user.target

    修改为:

    1. [Unit]
    2. Description=The PHP FastCGI Process Manager
    3. After=syslog.target network.target
    4. [Service]
    5. Type=simple
    6. PIDFile=/run/php-fpm.pid
    7. ExecStart=/etc/systemd/system --nodaemonize --fpm-config /etc/php-fpm.d/www.conf
    8. ExecReload=/bin/kill -USR2 $MAINPID
    9. ExecStop=/bin/kill -SIGINT $MAINPID
    10. [Install]
    11. WantedBy=multi-user.target

    10.剧本修改mysql脚本文件失败

    (1)报错

    (2)原因分析

    缺少passwd.sh文件

    (3)解决方法

    新建文件

    成功

  • 相关阅读:
    C#获取每个月的一号到最后一天
    Servlet urlPatterns配置
    001 linux 导学
    Alibaba Nacos注册中心源码剖析
    redis 生成流水工具类
    除静电离子风刀的工作原理及应用
    react生命周期函数
    QT+OSG/osgEarth编译之二十四:libbz2+Qt编译(一套代码、一套框架,跨平台编译,版本:libbz2-1.0.6)
    【无标题】
    驱动开发:内核枚举ShadowSSDT基址
  • 原文地址:https://blog.csdn.net/cronaldo91/article/details/132564962