• Ansible脚本进阶---playbook


    目录

    一、playbooks的组成

    二、案例

    2.1 在webservers主机组中执行一系列任务,包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。

    2.2 在名为dbservers的主机组中创建一个用户组(mysql)和一个用户(nginx),并将主机的IPv4地址写入文件。

    2.3 指定远程主机sudo切换用户

    2.4 when条件判断

    2.5 该Playbook的目标是在名为dbservers的主机组中创建两个目录并添加两个用户。

    2.6 使用Template在目标主机上安装和配置Apache HTTP服务器,以及创建Web服务器的根目录。一旦配置完成,处理程序将确保HTTP服务器重新启动,以使配置生效。

    2.5 tags 模块

    2.6 template 模块


    一、playbooks的组成

    playbooks 本身由以下各部分组成
    (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
    (2)Variables:变量
    (3)Templates:模板
    (4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
    (5)Roles:角色

    二、案例

    2.1 在webservers主机组中执行一系列任务,包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。

    1. //示例:
    2. vim test1.yaml
    3. --- #yaml文件以---开头,以表明这是一个yaml文件,可省略
    4. - name: first play #定义一个play的名称,可省略
    5. gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略
    6. hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
    7. remote_user: root #指定被管理主机上执行任务的用户
    8. tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
    9. - name: test connection #自定义任务名称
    10. ping: #使用 module: [options] 格式来定义一个任务
    11. - name: disable selinux
    12. command: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式
    13. ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
    14. - name: disable firewalld
    15. service: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=value格式
    16. - name: install httpd
    17. yum: name=httpd state=latest
    18. - name: install configuration file for httpd
    19. copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件
    20. notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
    21. - name: start httpd service
    22. service: enabled=true name=httpd state=started
    23. handlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
    24. - name: restart httpd #notify和handlers中任务的名称必须一致
    25. service: name=httpd state=restarted
    26. ##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
    27. //运行playbook
    28. ansible-playbook test1.yaml
    29. //补充参数:
    30. -k(–ask-pass):用来交互输入ssh密码
    31. -K(-ask-become-pass):用来交互输入sudo密码
    32. -u:指定用户
    33. ansible-playbook test1.yaml --syntax-check #检查yaml文件的语法是否正确
    34. ansible-playbook test1.yaml --list-task #检查tasks任务
    35. ansible-playbook test1.yaml --list-hosts #检查生效的主机
    36. ansible-playbook test1.yaml --start-at-task='install httpd' #指定从某个task开始运行

    2.2 在名为dbservers的主机组中创建一个用户组(mysql)和一个用户(nginx),并将主机的IPv4地址写入文件。

    1. //定义、引用变量
    2. - name: second play
    3. hosts: dbservers
    4. remote_user: root
    5. vars: #定义变量
    6. - groupname: mysql #格式为 key: value
    7. - username: nginx
    8. tasks:
    9. - name: create group
    10. group: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用变量的值
    11. - name: create user
    12. user: name={{username}} uid=306 group={{groupname}}
    13. - name: copy file
    14. copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息
    15. ansible-playbook test1.yaml -e "username=nginx" #在命令行里定义变量

    2.3 指定远程主机sudo切换用户

    1. //指定远程主机sudo切换用户
    2. ---
    3. - hosts: dbservers
    4. remote_user: zhangsan
    5. become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
    6. become_user: root #指定sudo用户为root
    7. 执行playbook时:ansible-playbook test1.yml -K <密码>

    2.4 when条件判断

    在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

    when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务。

    1. //when条件判断
    2. 在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
    3. //when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务
    4. vim test2.yaml
    5. ---
    6. - hosts: all
    7. remote_user: root
    8. tasks:
    9. - name: shutdown host
    10. command: /sbin/shutdown -r now
    11. when: ansible_default_ipv4.address == "192.168.10.14" #when指令中的变量名不需要手动加上 {{}}
    12. when: inventory_hostname == "<主机名>"
    13. ansible-playbook test2.yaml

    2.5 该Playbook的目标是在名为dbservers的主机组中创建两个目录并添加两个用户。

    1. //迭代
    2. Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
    3. vim test3.yaml
    4. ---
    5. - name: play1
    6. hosts: dbservers
    7. gather_facts: false
    8. tasks:
    9. - name: create directories
    10. file:
    11. path: "{{item}}"
    12. state: directory
    13. with_items: #等同于 loop:
    14. - /tmp/test1
    15. - /tmp/test2
    16. - name: add users
    17. user: name={{item.name}} state=present groups={{item.groups}}
    18. with_items:
    19. - name: test1
    20. groups: wheel
    21. - name: test2
    22. groups: root
    23. with_items:
    24. - {name:'test1', groups:'wheel'}
    25. - {name:'test2', groups:'root'}
    26. ansible-playbook test3.yaml

    2.6 使用Template在目标主机上安装和配置Apache HTTP服务器,以及创建Web服务器的根目录。一旦配置完成,处理程序将确保HTTP服务器重新启动,以使配置生效。

    1. //Templates 模块
    2. Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
    3. 1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
    4. cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
    5. vim /opt/httpd.conf.j2
    6. Listen {{http_port}} #42行,修改
    7. ServerName {{server_name}} #95行,修改
    8. DocumentRoot "{{root_dir}}" #119行,修改
    9. 2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
    10. vim /etc/ansible/hosts
    11. [webservers]
    12. 192.168.10.14 http_port=192.168.10.14:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs
    13. [dbservers]
    14. 192.168.10.15 http_port=192.168.0.15:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs
    15. 3.编写 playbook
    16. vim apache.yaml
    17. ---
    18. - hosts: all
    19. remote_user: root
    20. vars:
    21. - package: httpd
    22. - service: httpd
    23. tasks:
    24. - name: install httpd package
    25. yum: name={{package}} state=latest
    26. - name: install configure file
    27. template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板
    28. notify:
    29. - restart httpd
    30. - name: create root dir
    31. file: path=/etc/httpd/htdocs state=directory
    32. - name: start httpd server
    33. service: name={{service}} enabled=true state=started
    34. handlers:
    35. - name: restart httpd
    36. service: name={{service}} state=restarted
    37. ansible-playbook apache.yaml

    1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

    2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

    最后运行:ansible-playbook demo5.yaml

    ansible-playbook demo5.yaml

    服务安装好后,查看服务状态即可!!!

    2.5 tags 模块

    1. //tags 模块
    2. 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
    3. playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
    4. vim webhosts.yaml
    5. ---
    6. - hosts: webservers
    7. remote_user: root
    8. tasks:
    9. - name: Copy hosts file
    10. copy: src=/etc/hosts dest=/opt/hosts
    11. tags:
    12. - only #可自定义
    13. - name: touch file
    14. file: path=/opt/testhost state=touch
    15. tags:
    16. - always #表示始终要运行的代码
    17. ansible-playbook webhosts.yaml --tags="only"
    18. vim dbhosts.yaml
    19. ---
    20. - hosts: dbservers
    21. remote_user: root
    22. tasks:
    23. - name: Copy hosts file
    24. copy: src=/etc/hosts dest=/opt/hosts
    25. tags:
    26. - only
    27. - name: touch file
    28. file: path=/opt/testhost state=touch
    29. ansible-playbook dbhosts.yaml --tags="only"
    30. //分别去两台被管理主机上去查看文件创建情况

    2.6 template 模块

    1. //Roles 模块
    2. Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
    3. //roles 的目录结构:
    4. cd /etc/ansible/
    5. tree roles/
    6. roles/
    7. ├── web/
    8. │ ├── files/
    9. │ ├── templates/
    10. │ ├── tasks/
    11. │ ├── handlers/
    12. │ ├── vars/
    13. │ ├── defaults/
    14. │ └── meta/
    15. └── db/
    16. ├── files/
    17. ├── templates/
    18. ├── tasks/
    19. ├── handlers/
    20. ├── vars/
    21. ├── defaults/
    22. └── meta/
    23. //roles 内各目录含义解释
    24. ●files
    25. 用来存放由 copy 模块或 script 模块调用的文件。
    26. ●templates
    27. 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
    28. ●tasks
    29. 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
    30. ●handlers
    31. 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
    32. ●vars
    33. 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
    34. ●defaults
    35. 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
    36. ●meta
    37. 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。
    38. //在一个 playbook 中使用 roles 的步骤:
    39. (1)创建以 roles 命名的目录
    40. mkdir /etc/ansible/roles/ -p #yum装完默认就有
    41. (2)创建全局变量目录(可选)
    42. mkdir /etc/ansible/group_vars/ -p
    43. touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
    44. (3)在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql
    45. mkdir /etc/ansible/roles/httpd
    46. mkdir /etc/ansible/roles/mysql
    47. (4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
    48. mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
    49. mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
    50. (5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
    51. touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
    52. touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
    53. (6)修改 site.yml 文件,针对不同主机去调用不同的角色
    54. vim /etc/ansible/site.yml
    55. ---
    56. - hosts: webservers
    57. remote_user: root
    58. roles:
    59. - httpd
    60. - hosts: dbservers
    61. remote_user: root
    62. roles:
    63. - mysql
    64. (7)运行 ansible-playbook
    65. cd /etc/ansible
    66. ansible-playbook site.yml
    67. 示例:
    68. mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
    69. mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
    70. mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
    71. touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
    72. touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
    73. touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
    74. ------编写httpd模块------
    75. 写一个简单的tasks/main.yml
    76. vim /etc/ansible/roles/httpd/tasks/main.yml
    77. - name: install apache
    78. yum: name={{pkg}} state=latest
    79. - name: start apache
    80. service: enabled=true name={{svc}} state=started
    81. //定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
    82. vim /etc/ansible/roles/httpd/vars/main.yml
    83. pkg: httpd
    84. svc: httpd
    85. -------编写mysql模块-------
    86. vim /etc/ansible/roles/mysql/tasks/main.yml
    87. - name: install mysql
    88. yum: name={{pkg}} state=latest
    89. - name: start mysql
    90. service: enabled=true name={{svc}} state=started
    91. vim /etc/ansible/roles/mysql/vars/main.yml
    92. pkg:
    93. - mariadb
    94. - mariadb-server
    95. svc: mariadb
    96. -------编写php模块-----
    97. vim /etc/ansible/roles/php/tasks/main.yml
    98. - name: install php
    99. yum: name={{pkg}} state=latest
    100. - name: start php-fpm
    101. service: enabled=true name={{svc}} state=started
    102. vim /etc/ansible/roles/php/vars/main.yml
    103. pkg:
    104. - php
    105. - php-fpm
    106. svc: php-fpm
    107. -----编写roles示例-----
    108. vim /etc/ansible/site.yml
    109. ---
    110. - hosts: webservers
    111. remote_user: root
    112. roles:
    113. - httpd
    114. - mysql
    115. - php
    116. cd /etc/ansible
    117. ansible-playbook site.yml

  • 相关阅读:
    【Python】Python语言基础(中)
    Windows11 安全中心页面不可用问题(无法打开病毒和威胁防护)解决方案汇总(图文介绍版)
    RC4Drop加密技术:原理、实践与安全性探究
    【深度学习】Pytorch torch.autograd 自动差分引擎
    结构型设计模式——桥接模式
    el-dialog固定高度
    SSM之Spring注解式缓存Redis
    机器学习 - 机器学习理论基础
    Unix 进程一日游
    算法的时间复杂度和空间复杂度
  • 原文地址:https://blog.csdn.net/m0_72359405/article/details/133857464