Top

NSD AUTOMATION DAY05

  1. 案例1:Playbook应用案例
  2. 案例2:Ansible变量应用案例

1 案例1:Playbook应用案例

1.1 问题

沿用练习二,编写Ansible Playbook剧本,使用Playbook完成自动化操作,具体要求如下:

1.2 方案

Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。

YAML是什么?

YAML的格式要求如下:

YAML示例展示:

1)demo1

  1. ---
  2. "诗仙": "李白"
  3. 或者
  4. "诗仙":
  5. "李白"

2)demo2

  1. #数组的例子
  2. ---
  3. - "李白"
  4. - "杜甫"
  5. - "白居易"
  6. - "唐僧"

3)demo3

  1. #使用一行表示数组的例子
  2. ---
  3. "诗人": ["李白","杜甫","白居易"]

4)demo4

  1. #键值对和数组符合例子:
  2. ---
  3. "诗人":
  4. - "李白"
  5. - "杜甫"
  6. - "白居易"

5)demo5

  1. #复杂案例
  2. ---
  3. - "诗人":
  4. - 唐代:
  5. - "李白"
  6. - "杜甫"
  7. - 宋代:
  8. - "苏轼"
  9. - "李清照"

6)demo6

  1. #喜欢的电影
  2. ---
  3. - 芳华
  4. - 战狼
  5. - 霸王别姬

7)demo7

  1. #人物描述
  2. ---
  3. - 姓名: 李白
  4. 年龄: 61
  5. 作品: 蜀道难
  6. 好友: 汪伦

8)demo8

  1. #跨行文本(计算机理解为一行)
  2. ---
  3. 自我介绍: >
  4. 字太白,号青莲居士,
  5. 唐代诗人,祖籍陇西郡,
  6. 今甘肃省平凉市

9)demo9

  1. #跨行文本(计算机理解为多行)
  2. ---
  3. 自我介绍: |
  4. 字太白,号青莲居士,
  5. 唐代诗人,祖籍陇西郡,
  6. 今甘肃省平凉市

10)demo10

注意-和:后面必须有空格。

  1. #一张发票
  2. ---
  3. 发票编号: 34843
  4. 日期: 2028-12-12
  5. 商品:
  6. - 商品编号: BL394D
  7. 描述: 足球
  8. 价格: 100
  9. - 商品编号: BL4438H
  10. 描述: 棒球
  11. 价格: 200
  12. 税费: 10.00
  13. 总价: 310.00
  14. 备注: >
  15. 本次采购商品均
  16. 属于球类运动商品.

11)demo11

  1. #错误日志
  2. ---
  3. 时间: 2028-10-01 15:01:42
  4. 用户: ed
  5. 错误信息:
  6. - 文件: nginx.conf
  7. 行号: 23
  8. 错误编码: "0x3D5FF1"
  9. - 文件: test.php
  10. 行号: 12
  11. 错误代码: "0xA4C51E"
  12. 警告信息: |
  13. 你有两个错误信息需要查看,
  14. 一条是配置文件错误,
  15. 一条是脚本语法错误,
  16. 具体内容参考错误信息.

Playbook语法格式要求如下:

步骤一:测试Playbook语法格式

1)编写第一个Playbook(剧本)

hosts、tasks、name是关键词(不可修改),ping是模块,调用不同模块完成不同任务。

  1. [root@control ansible]# vim ~/ansible/test.yml
  2. ---
  3. - hosts: all                                #hosts定义要远程谁?
  4. tasks:                                    #tasks定义远程后要执行的任务有哪些?
  5. - name: This is my first playbook #name后面的具体内容可以任意
  6. ping:
  7. [root@control ansible]# ansible-playbook ~/ansible/test.yml

执行效果如图-1所示。

图-1

2)定义多个主机和任务的剧本

hosts由一个或多个组或主机组成,逗号分隔,tasks由一个或多个任务组成,多个任务按顺序执行,执行ansible-playbook命令可以使用-f选项自定义并发量。

  1. [root@control ansible]# vim ~/ansible/test.yml
  2. - hosts: test,webserver
  3. tasks:
  4. - name: This is my first playbook #name后面的内容可以任意
  5. ping:
  6. - name: Run a shell command
  7. shell: touch ~/shell.txt
  8. #hosts定义需要远程哪些被管理主机,hosts是关键词
  9. #tasks定义需要执行哪些任务,tasks是关键词
  10. #第一个任务调用ping模块,该模块没有参数
  11. #第二个任务调用shell模块在被管理主机创建一个空文件~/shell.txt
  12.  
  13. [root@control ansible]# ansible-playbook ~/ansible/test.yml -f 5
  14. ## 验证:到node1、node3、node4主机分别执行命令ls /root/shell.txt查看是否有该文件

3)多个play的Playbook文件

  1. [root@control ansible]# vim ~/ansible/test.yml
  2. #第一个play剧目
  3. ---
  4. - hosts: test
  5. tasks:
  6. - name: This is first play
  7. ping:
  8. #第二个play剧目
  9. - hosts: webserver
  10. tasks:
  11. - name: This is second play
  12. ping:

步骤二:Playbook应用案例

1)用户管理,创建系统账户、账户属性、设置密码(ansible-doc user)。

  1. [root@control ansible]# vim ~/ansible/test_john.yml
  2. ---
  3. - hosts: webserver
  4. tasks:
  5. - name: Add the user 'johnd'
  6. user:
  7. name: johnd
  8. uid: 1040
  9. group: daemon
  10. password: "{{ '123' | password_hash('sha512') }}"
  11. #hosts定义需要远程的对象是webserver组,hosts是关键词
  12. #tasks定义需要执行的任务,tasks是关键词
  13. # name是第一个任务的描述信息,描述信息可以任意
  14. # user是第一个任务需要调用的模块,user下面的缩进内容是给user模块的参数
  15. # name是需要创建的用户名,uid是用户ID号
  16. # group是用户属于哪个基本组
  17. # password是用户的密码,密码是123,密码经过sha512算法加密
  18.  
  19. [root@control ansible]# vim ~/ansible/user_james.yml
  20. ---
  21. - hosts: webserver
  22. tasks:
  23. - name: Add 'james' with a bash shell
  24. user:
  25. name: james
  26. shell: /bin/bash
  27. groups: bin,adm
  28. password: "{{ '123' | password_hash('sha512') }}"
  29. #与上一个案例类似,groups指定用户属于哪些附加组.
  30.  
  31. [root@control ansible]# vim ~/ansible/user_johnd.yml
  32. ---
  33. - hosts: webserver
  34. tasks:
  35. - name: Remove the user 'johnd'
  36. user:
  37. name: johnd
  38. state: absent
  39. #删除系统账户johnd,state的值设置为absent是删除用户

2)使用playbook管理逻辑卷

准备工作:给node2主机再添加一块磁盘(以下实验磁盘名称仅为参考,不要照抄)。

注意:请确保node2主机提前安装了lvm2软件包。

(ansible-doc parted,ansible-doc lvg,ansible-doc lvol)

  1. [root@control ansible]# vim ~/ansible/lvm.yml
  2. ---
  3. - hosts: node2                            #远程node2主机
  4. tasks:
  5. - name: Create a new primary partition with a size of 1GiB #任务的描述信息
  6. parted: #调用parted模块进行分区
  7. device: /dev/vdb #对/dev/vdb磁盘进行分区(磁盘名称不要照抄)
  8. label: gpt #分区表类型为gpt,或msdos
  9. number: 1 #分区编号(创建第几个分区)
  10. state: present #present是创建分区,absent是删除分区
  11. part_start: 1MiB #分区的开始位置(默认从最开始位置分区)
  12. part_end: 1GiB #分区的结束位置(不写就分到磁盘最后位置)
  13. - name: Create a volume group on top of /dev/vdb1 #第二个任务的描述信息
  14. lvg: #调用lvg模块,创建VG卷组
  15. vg: my_vg #要创建的卷组名称
  16. pvs: /dev/vdb1 #使用哪个分区创建PV
  17. - name: Create a logical volume of 512m #第三个任务的描述信息
  18. lvol: #调用lvol模块创建LV
  19. vg: my_vg #使用哪个VG创建LV
  20. lv: my_lv #需要创建的LV名称
  21. size: 512m #要创建的LV大小,可以不指定单位,默认单位m

3)使用playbook管理软件(ansible-doc yum)

RHEL或CentOS系统中的软件有组包的概念,使用yum grouplist或者dnf grouplist可以查看组包的名称。

  1. [root@control ansible]# vim ~/ansible/package.yml
  2. ---
  3. - hosts: webserver #需要远程的主机是谁
  4. tasks: #定义剧本需要执行的任务
  5. - name: Install a list of packages #第一个任务的描述信息
  6. yum: #调用yum模块安装软件
  7. name: #安装软件的名字,它的值有多个,使用数组-
  8. - httpd #安装httpd软件
  9. - mariadb #安装mariadb软件
  10. - mariadb-server #安装mariadb-server
  11. - name: install the 'RPM Development Tools' package group #第二个任务的描述信息
  12. yum: #调用yum模块安装软件组包
  13. name: "@RPM Development Tools" #安装哪个组包,@是关键词
  14. - name: update software #第三个任务的描述信息
  15. yum: #调用yum模块升级软件
  16. name: '*' #需要升级哪些软件
  17. state: latest #latest代表升级软件
  18. #备注:state的值可以是(present|absent|latest)
  19. #present代表安装软件(默认是present);absent代表卸载软件
  20. #latest代表升级软件

2 案例2:Ansible变量应用案例

2.1 问题

沿用前面课程环境,继续练习Ansible 特殊模块并掌握自定义变量的方式,具体要求如下:

步骤一:Ansible特殊模块

1)setup模块

ansible_facts用于采集被管理设备的系统信息,所有收集的信息都被保存在变量中,每次执行playbook默认第一个任务就是Gathering Facts,使用setup模块可以查看收集到的facts信息。

  1. [root@control ansible]# ansible test -m setup
  2. 192.168.4.10 | SUCCESS => {
  3. "ansible_facts": {
  4. "ansible_all_ipv4_addresses": [
  5. … 省略部分内容…

试试自己找出下列变量:

2)debug模块

debug模块可以显示变量的值,可以辅助排错,通过msg可以显示变量的值,变量需要使用{{}}扩起来。

  1. [root@control ansible]# vim ~/ansible/debug.yml
  2. ---
  3. - hosts: test
  4. tasks:
  5. - debug:
  6. msg: "主机名是:{{ ansible_hostname }}"
  7. - debug:
  8. msg: "总内存大小:{{ ansible_memtotal_mb }}"
  9. #备注调用debug模块显示某些具体的变量值
  10. #debug模块可以显示变量的值,可以辅助排错

步骤二:定义变量的方法

Ansible支持十几种定义变量的方式,这里我们仅介绍其中一部分变量。

下面是根据优先级排序的定义方式:

  1. Inventory变量
  2. Host Facts变量
  3. Playbook变量
  4. 变量文件

1)Inventory变量(在主机清单配置文件中定义变量)。

  1. [root@control ansible]# vim ~/ansible/inventory
  2. [test]
  3. node1 iname="nb"
  4. [proxy]
  5. node2
  6. [webserver]
  7. node[3:4]
  8. [webserver:vars]
  9. iname="dachui"
  10. #备注,在node1主机后面给该主机添加变量iname,值为nb.
  11. #给webserver组定义变量,vars是关键词不可以改变,webserver是上面定义的组
  12. #给这个组定义变量iname="dachui"
  13. ... ...<部分后面的内容省略>... ...

下面编写剧本调用刚才的变量:(在剧本中需要调用变量是要使用{{}})

  1. [root@control ansible]# vim ~/ansible/inventory_var.yml
  2. ---
  3. - hosts: node1,webserver #定义需要远程管理的主机是谁
  4. tasks: #剧目要完成哪些任务
  5. - name: create a user with var. #剧目中的第一个任务描述信息
  6. user: #调用user模块创建用户
  7. name: "{{ iname }}" #需要创建的用户名是iname这个变量
  8. #注意事项:
  9. #在ansible剧本中当调用变量时,开始位置就调用变量,就需要在{{}}外面加双引号
  10. #如果是在后面或者中间位置调用变量{{}}外面可以不加双引号,也可以加双引号
  11. #如:
  12. # "{{ iname }}"
  13. # nihao {{ iname }}

2)Host Facts变量(可以直接调用ansible收集的系统信息)

  1. [root@control ansible]# vim ~/ansible/facts_var.yml
  2. ---
  3. - hosts: test
  4. tasks:
  5. - name: create user.
  6. user:
  7. name: "{{ansible_hostname}}"
  8. #定义剧本,远程所有被管理主机,调用user模块,创建用户
  9. #需要创建的用户名ansible_hostname是一个ansible_facts变量
  10. #验证: 到node1主机查看是否有一个与主机名同名的用户

3)Playbook变量(使用vars关键词可以在playbook内定义变量)。

  1. [root@control ansible]# vim ~/ansible/playbook_var.yml
  2. ---
  3. - hosts: test
  4. vars: #vars是关键词,用来定义变量用的
  5. iname: heal #具体变量名是iname,值是heal
  6. ipass: '123456' #再定义一个变量名是ipass,值是123456
  7. #注意密码必须是字符串,需要引号
  8. tasks: #tasks定义需要执行的任务
  9. - name: Use variables create user. #给任务写个描述信息
  10. user: #调用user模块创建用户
  11. name: "{{ iname }}" #用户名的是前面定义的变量
  12. password: "{{ ipass | password_hash('sha512') }}"
  13. #密码是前面定义好的ipass,管道给password_hash把密码加密.

4)单独定义个变量文件,在playbook中用vars_files调用该文件。

  1. [root@control ansible]# vim ~/ansible/file_var.yml
  2. ---
  3. - hosts: test
  4. vars_files: variables.yml #当变量比较多时,专门定义一个文件用来存变量
  5. tasks:
  6. - name: create user.
  7. user:
  8. name: "{{ iname }}"
  9. password: "{{ ipass | password_hash('sha512') }}"
  10. #调用user模块创建用户
  11. #用户名是变量文件variables.yml中定义的变量iname,密码也是变量文件中定义的变量
  12. [root@control ansible]# vim ~/ansible/variables.yml
  13. ---
  14. iname: cloud
  15. ipass: '123456'

附加思维导图,如图-2所示:

图-2