• 自动化运维——ansible (五十三) (02)


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    今天是接上次的内容,讲的还是模块的部分。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、模块

    1.1 playbook

    playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

    使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)

    1.1.1 YMAL格式

    以.yaml或.yml结尾

    文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)

    以#号开头为注释

    列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)

    一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)

    ==注意: 写这种文件不要使用tab键,都使用空格==

    下面看一个官方的示例感受一下

    1. ---
    2. # 一位职工记录
    3. name: Example Developer
    4. job: Developer
    5. skill: Elite
    6. employed: True
    7. foods:
    8. - Apple
    9. - Orange
    10. - Strawberry
    11. - Mango
    12. languages:
    13. ruby: Elite
    14. python: Elite
    15. dotnet: Lame

    1.1.2 playbook实例

    先直接来看一个实例

    第1步: 创建一个存放playbook的目录(路径自定义)

    master# mkdir /etc/ansible/playbook

    第2步: 准备httpd配置文件,并修改成你想要的配置

    master# yum install httpd -y
    ​
    按需要修改你想要的配置(为了测试可以随意改动标记一下)
    master# vim /etc/httpd/conf/httpd.conf

    第3步: 写一个playbook文件(后缀为.yml或.yaml)

    # vim /etc/ansible/playbook/example.yaml
    ---
    - hosts: group1
      remote_user: root
      tasks:  
      - name: ensure apache is at the latest version    
        yum: name=httpd,httpd-devel state=latest
        
      - name: write the apache config file      
        copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
        
        notify:
        - restart apache
        
      - name: ensure apache is running (and enable it at boot)
        service: name=httpd state=started enabled=yes
        
      handlers: 
        - name: restart apache
          service: name=httpd state=restarted

    第4步: 执行写好的palybook

    • 会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

    • 执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

    # ansible-playbook /etc/ansible/playbook/example.yaml

    1.1.3 Playbook常见语法

    hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.

    remote_user: 用于指定远程主机上的执行任务的用户.

    - hosts: group1         
      remote_user: root 
    

    tasks: 任务列表, 按顺序执行任务.

    • 如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.

      tasks:
      - name: ensure apache is at the latest version    
        yum: name=httpd,httpd-devel state=latest
        
      - name: write the apache config file      
        copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    

    handlers: 类似task,但需要使用notify通知调用。

    • 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.

    • handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

        notify:               
        - restart apache
        
      - name: ensure apache is running (and enable it at boot)
        service: name=httpd state=started enabled=yes
        
      handlers:
      - name: restart apache
        service: name=httpd state=restarted

    variables: 变量

    • 定义变量可以被多次方便调用

    master# vim /etc/ansible/playbook/example2.yaml
    ---
    - hosts: group1
      remote_user: root
      vars:
      - user: test1
      tasks:
      - name: create user
        user: name={{user}} state=present
    ~                                           
    master# ansible-playbook /etc/ansible/playbook/example2.yaml

    案例: playbook编排vsftpd

    写一个playbook实现

    1. 配置yum

    2. 安装vsftpd包

    3. 修改配置文件(要求拒绝匿名用户登录)

    4. 启动服务并实现vsftpd服务开机自动启动

    ---
    - hosts: group1                 
      remote_user: root                     
      tasks:                                
      - name: rm yum repository      
        file: path=/etc/yum.repos.d/ state=absent
        
      - name: 同步master上的yum源到group1
        copy: src=/etc/yum.repos.d dest=/etc/
        
      - name: ensure vsftpd is at the latest version        
        yum: name=vsftpd state=latest
        
      - name: write the apache config file          
        copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf 
        
        notify:                             
        - restart vsftpd
        
      - name: ensure vsftpd is running (and enable it at boot)
        service: name=vsftpd state=started enabled=yes
        
      handlers:                     
        - name: restart vsftpd              
          service: name=vsftpd state=restarted

    1.1.4 playbook编排多个hosts任务

    ---         # ---代表开始(可选项,不写也可以)
    - hosts: 10.1.1.12
      remote_user: root
      tasks:
      - name: 创建/test1/目录
        file: path=/test1/ state=directory
    # 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
    - hosts: 10.1.1.13
      remote_user: root
      tasks:
      - name: 创建/test2/目录
        file: path=/test2/ state=directory
    ...         # ...代表结束(可选项,不写也可以)
    

    案例: 编排nfs搭建与客户端挂载

    1, 在master上准备nfs配置文件

    # vim /etc/exports
    /share  *(ro)

    2, 编写yaml编排文件

    # vim /etc/ansible/playbook/nfs.yaml
    ---
    - hosts: 192.168.156.12
      remote_user: root
      tasks:
      - name: 安装nfs服务相关软件包
        yum: name=nfs-utils,rpcbind,setup  state=latest
    ​
      - name: 创建共享目录
        file: path=/share/ state=directory
    ​
      - name: 同步nfs配置文件
        copy: src=/etc/exports dest=/etc/exports
    ​
        notify: restart nfs
    ​
      - name: 启动rpcbind服务,并设置为开机自启动
        service: name=rpcbind state=started enabled=on
    ​
      - name: 启动nfs服务,并设置为开机自启动
        service: name=nfs state=started enabled=on
    ​
      handlers:
      - name: restart nfs
        service: name=nfs state=restarted
    ​
    - hosts: 192.168.156.13
      remote_user: root
      tasks:
      - name: 安装nfs客户端软件包
        yum: name=nfs-utils state=latest
    ​
      - name: 挂载nfs服务器的共享
        shell: mount 192.168.156.12:/share /mnt

    3, 执行playbook

    # ansible-playbook /etc/ansible/playbook/nfs.yaml
    1. [root@hd1 ~]# vim /etc/ansible/playbook/nfs.yaml
    2. [root@hd1 ~]# ansible-playbook /etc/ansible/playbook/nfs.yaml
    3. PLAY [192.168.156.12] *************************************************************************************
    4. TASK [Gathering Facts] ************************************************************************************
    5. ok: [192.168.156.12]
    6. TASK [安装nfs服务相关软件包] ***************************************************************************************
    7. changed: [192.168.156.12]
    8. TASK [创建共享目录] *********************************************************************************************
    9. changed: [192.168.156.12]
    10. TASK [同步nfs配置文件] ******************************************************************************************
    11. changed: [192.168.156.12]
    12. TASK [启动rpcbind服务,并设置为开机自启动] ******************************************************************************
    13. ok: [192.168.156.12]
    14. TASK [启动nfs服务,并设置为开机自启动] **********************************************************************************
    15. changed: [192.168.156.12]
    16. RUNNING HANDLER [restart nfs] *****************************************************************************
    17. changed: [192.168.156.12]
    18. PLAY [192.168.156.13] *************************************************************************************
    19. TASK [Gathering Facts] ************************************************************************************
    20. ok: [192.168.156.13]
    21. TASK [安装nfs客户端软件包] ****************************************************************************************
    22. changed: [192.168.156.13]
    23. TASK [挂载nfs服务器的共享] ****************************************************************************************
    24. [WARNING]: Consider using the mount module rather than running 'mount'. If you need to use command
    25. because mount is insufficient you can add 'warn: false' to this command task or set
    26. 'command_warnings=False' in ansible.cfg to get rid of this message.
    27. changed: [192.168.156.13]
    28. PLAY RECAP ************************************************************************************************
    29. 192.168.156.12 : ok=7 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    30. 192.168.156.13 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

    1.2 roles

    1.2.1 roles介绍

    roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。

    假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。

    1.2.2 创建roles的目录结构

    files:用来存放由copy模块或script模块调用的文件。
    tasks:至少有一个main.yml文件,定义各tasks。
    handlers:有一个main.yml文件,定义各handlers。
    templates:用来存放jinjia2模板。
    vars:有一个main.yml文件,定义变量。
    meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。

    注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.

    1.2.3 通过roles实现lamp

    需定制三个角色: httpd,mysql,php

    第1步: 创建roles目录及文件,并确认目录结构

    master# cd /etc/ansible/roles/
    master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
    master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
    ​
    master# yum install tree -y
    master# tree /etc/ansible/roles/
    /etc/ansible/roles/
    ├── httpd
    │   ├── files
    │   ├── handlers
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars
    │       └── main.yml
    ├── mysql
    │   ├── files
    │   ├── handlers
    │   │   └── main.yml
    │   ├── meta
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   ├── templates
    │   └── vars
    │       └── main.yml
    └── php
        ├── files
        ├── handlers
        │   └── main.yml
        ├── meta
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        ├── templates
        └── vars
            └── main.yml

    第2步: 准备httpd服务器的主页文件,php测试页和配置文件等

    master# echo "test main page" > /etc/ansible/roles/httpd/files/index.html
    ​
    ​
    master# echo -e "" > /etc/ansible/roles/httpd/files/test.php 
    ​
    ​
    master# yum install httpd -y
    按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
    master# vim /etc/httpd/conf/httpd.conf
    master# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files
    

    第3步: 编写httpd角色的main.yml文件

       vim /etc/ansible/roles/httpd/files/main.yml

     ---
     - name: 安装httpd
       yum: name=httpd,httpd-devel state=present
    ​
     - name: 同步httpd配置文件
       copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
    ​
       notify: restart httpd
    ​
     - name: 同步主页文件
       copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html
    ​
     - name: 同步php测试页
       copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php
    ​
     - name: 启动httpd并开机自启动
       service: name=httpd state=started enabled=yes

    第4步: 编写httpd角色里的handler

    master# vim /etc/ansible/roles/httpd/handlers/main.yml
    ---
    - name: restart httpd
      service: name=httpd state=restarted

    第5步: 编写mysql角色的main.yml文件

    ---
    - name: 安装mysql
      yum: name=mariadb,mariadb-server,mariadb-devel state=present
    ​
    - name: 启动mysql并开机自启动
      service: name=mariadb state=started enabled=yes

    第6步: 编写php角色的main.yml文件

    master# vim /etc/ansible/roles/php/tasks/main.yml
    ---
    - name: 安装php及依赖包
      yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
    ​
      notify: restart httpd

    第7步:编写lamp的playbook文件调用前面定义好的三个角色

    master# vim /etc/ansible/playbook/lamp.yaml
    ---
    - hosts: group1
      remote_user: root
      roles:
        - httpd
        - mysql
        - php

    第8步: 执行lamp的playbook文件

    master# ansible-playbook /etc/ansible/playbook/lamp.yaml
    

    拓展案例: 通过roles实现lamp并安装discuz

    第1步: 创建roles目录及文件,并确认目录结构

    master# cd /etc/ansible/roles/
    master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
    master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml

    第2步: 准备httpd相关文件

    master# ls /etc/ansible/roles/httpd/files/
    Discuz_X3.2_SC_UTF8.zip                     Discuz相关软件包
    httpd.conf                                  配置好的httpd.conf配置文件

    第3步: 编写httpd角色的main.yml文件

    master# vim /etc/ansible/roles/httpd/tasks/main.yml
    - name: 安装httpd相关软件包
      yum: name=httpd,httpd-devel state=latest
    ​
    - name: 同步配置文件
      copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
    ​
      notify: restart httpd
    ​
    - name: 拷贝discuz压缩包
      copy: src=/etc/ansible/roles/httpd/files/Discuz_X3.2_SC_UTF8.zip dest=/tmp/
    ​
    - name: 解压并mv网站文件到httpd家目录
      shell: rm -rf /var/www/html/*  && rm -rf /test/ && mkdir -p /test/ &&  unzip /tmp/Discuz_X3.2_SC_UTF8.zip -d /test/ &> /dev/null  && mv /test/upload/* /var/www/html/ && chown -R apache.apache /var/www/html/
    # 上面的命令有点多,可以写成脚本,然后使用script模块来调用执行
    ​
    - name: 启动httpd并开机自启动
      service: name=httpd state=started enabled=on
    ​

    第4步: 编写httpd角色里的handler

    master# vim /etc/ansible/roles/httpd/handlers/main.yml
    ---
    - name: restart httpd
      service: name=httpd state=restarted

    第5步: 编写mysql角色的main.yml文件

    master# vim /etc/ansible/roles/mysql/tasks/main.yml
    ---
    - name: 安装mariadb相关软件包
      yum: name=mariadb-server,mariadb-devel state=latest
    ​
    - name: 启动mariadb服务并设置开机自启动
      service: name=mariadb state=started enabled=on
    ​
    - name: 执行建库脚本
      script: /etc/ansible/roles/mysql/files/create.sh

    第6步: 编写mysql的建库脚本

    master# vim /etc/ansible/roles/mysql/files/create.sh
    ​
    #!/bin/bash 
    ​
    mysql << EOF
    create database if not exists discuz default charset=utf8;
    grant all on discuz.* to 'discuz'@'localhost' identified by '123';
    flush privileges;
    EOF

    第7步: 编写php角色的main.yml文件

    master# vim /etc/ansible/roles/php/tasks/main.yml
    ---
    - name: 安装php相关软件包
      yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
    ​
      notify: restart httpd

    第8步:编写lamp的playbook文件调用前面定义好的三个角色

    master# vim /etc/ansible/playbook/lamp.yaml
    ---
    - hosts: group1
      remote_user: root
      roles:
        - httpd
        - mysql
        - php

    第9步: 执行lamp的playbook文件

    master# ansible-playbook /etc/ansible/playbook/lamp.yaml
    1. [root@hd1 files]# ansible-playbook /etc/ansible/playbook/lamp.yaml
    2. PLAY [group1] *********************************************************************************************
    3. TASK [Gathering Facts] ************************************************************************************
    4. ok: [192.168.156.12]
    5. ok: [192.168.156.13]
    6. TASK [安装httpd相关软件包] ***************************************************************************************
    7. ok: [192.168.156.12]
    8. ok: [192.168.156.13]
    9. TASK [httpd : 同步配置文件] *************************************************************************************
    10. ok: [192.168.156.13]
    11. ok: [192.168.156.12]
    12. TASK [httpd : 拷贝discuz压缩包] ********************************************************************************
    13. changed: [192.168.156.13]
    14. changed: [192.168.156.12]
    15. TASK [解压并mv网站文件到httpd家目录] *********************************************************************************
    16. [WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use
    17. command because file is insufficient you can add 'warn: false' to this command task or set
    18. 'command_warnings=False' in ansible.cfg to get rid of this message.
    19. changed: [192.168.156.12]
    20. changed: [192.168.156.13]
    21. TASK [启动httpd并开机自启动] **************************************************************************************
    22. ok: [192.168.156.13]
    23. ok: [192.168.156.12]
    24. TASK [mysql : 安装mariadb相关软件包] *****************************************************************************
    25. changed: [192.168.156.13]
    26. changed: [192.168.156.12]
    27. TASK [mysql : 启动mariadb服务并设置开机自启动] ************************************************************************
    28. changed: [192.168.156.13]
    29. changed: [192.168.156.12]
    30. TASK [mysql : 执行建库脚本] *************************************************************************************
    31. changed: [192.168.156.12]
    32. changed: [192.168.156.13]
    33. TASK [安装php及依赖包] ******************************************************************************************
    34. ok: [192.168.156.12]
    35. ok: [192.168.156.13]
    36. PLAY RECAP ************************************************************************************************
    37. 192.168.156.12 : ok=10 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
    38. 192.168.156.13 : ok=10 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

    总结

    以上就是今天要讲的内容,内容详细,但也是仅供参考。

  • 相关阅读:
    数据处理及跳转
    MYSQL——二、理论基础
    HTML5简介-HTML5 新增语义化标签-HTML5 新增多媒体标签
    Maven 基本使用及依赖管理。
    12、Python -- if 分支 的讲解和使用
    C#知识点、常见面试题
    界面控件DevExtreme JS & ASP.NET Core 2024年度产品规划预览(一)
    Nacos Config--服务配置
    RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤
    Java日志
  • 原文地址:https://blog.csdn.net/Coisini_LZB/article/details/132800303