当前位置: 代码迷 >> 综合 >> Ansible Playbook剧本
  详细解决方案

Ansible Playbook剧本

热度:10   发布时间:2023-12-01 20:46:28.0

编写Ansible Playbook剧本,使用Playbook完成自动化操作

  • 熟悉Playbook语法格式
  • 编写Playbook管理系统账户
  • 编写Playbook管理逻辑卷
  • 编写Playbook管理软件包

YAML的格式要求如下:

  • "#"代表注释,一般第一行为三个横杠(---)
  • 键值【(key/value)->(a: 11)和a=11一个性质】对使用":"表示,数组(一个变量有多个值){a=(11  12  13)}使用"-"表示,"-"后面有空格数组
  • key和value之间使用":"分隔,":"后面必须有空格
  • 一般缩进由两个或以上空格组成
  • 相同层级的缩进必须对齐,缩进代表层级关系
  • 全文不可以使用tab键
  • 区分大小写
  • 扩展名为yml或者yaml
  • 跨行数据需要使用>或者|,其中|会保留换行符

Playbook语法格式要求如下:

  • playbook采用YAML格式编写
  • playbook文件中由一个或多个play组成
  • 每个play中可以包含:
  • hosts(主机)、tasks(任务)、vars(变量)等元素组成
  • 使用ansible-playbook命令运行playbook剧本

测试Playbook语法格式

编写第一个Playbook(剧本)

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

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

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

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

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

多个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:

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

  • [root@control ansible]# vim ~/ansible/test_john.yml
  • ---
  • - hosts: webserver
  •   tasks:
  •      - name: Add the user 'johnd'
  •        user:
  •            name: johnd
  •            uid: 1040
  •            group: daemon
  •            password: "{ { '123' | password_hash('sha512') }}"
  • #hosts定义需要远程的对象是webserver组(指定主机),hosts是关键词
  • #tasks定义需要执行的任务,tasks是关键词
  • # name是第一个任务的描述信息,描述信息可以任意
  • # user是第一个任务需要调用的模块,user下面的缩进内容是给user模块的参数
  • # name是需要创建的用户名,uid是用户ID号
  • # group是用户属于哪个基本组
  • # password是用户的密码,密码是123,密码经过sha512算法加密

---
- hosts: test
  tasks:
      - name: add the user 'johnd'
        user:
                name: james
                shell: /bin/bash
                password: "{ { '123' | password_hash('sha512') }}"
#与上一个案例类似,groups指定用户属于哪些附加组.和指定解释执行器

---
- hosts: test
  tasks:
      - name:   shanchu'johnd'         #不一定有任务名字,知识单纯起个名字
        user:
                name: james
                state: absent
#删除用户

使用playbook管理逻辑卷

准备工作:给node2主机再添加一块磁盘

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

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

  1. ---
  2. - hosts: node2            #远程node2主机
  3.   tasks:
  4.           - name: fenqu              #任务的描述信息
  5.             parted:                            #调用parted模块进行分区
  6.                     device: /dev/sdb     #对/dev/sdb磁盘进行分区
  7.                     label: gpt                    #分区表类型为gpt,或msdos
  8.                     number: 1               #分区编号(创建第几个分区)
  9.                     state: present          #present是创建分区,absent是删除分区
  10.                     part_start: 1MiB       #分区的开始位置(默认从最开始位置分区)
  11.                     part_end: 1GiB        #分区的结束位置(不写就分到磁盘最后位置)
  12.           - name: lv                     #第二个任务的描述信息
  13.             lvg:                                #调用lvg模块,创建VG卷组
  14.                     vg: my_vg            #要创建的卷组名称
  15.                     pvs: /dev/sdb1          #使用哪个分区创建PV
  16.           - name: vg                    #第三个任务的描述信息
  17.             lvol:                             #调用lvol模块创建LV
  18.                     vg: my_vg            #使用哪个VG创建LV
  19.                     lv: my_lv               #需要创建的LV名称
  20.                     size: 512m            #要创建的LV大小,可以不指定单位,默认单位m
  21. state的值可以是(present|absent|latest)
  22. present代表安装软件(默认是present);absent代表卸载软件
  23. latest代表升级软件

使用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: zhuangbao            #第一个任务的描述信息
  6.             yum:                               #调用yum模块安装软件
  7.                     name:                        #安装软件的名字,它的值有多个,使用数组-
  8.                             - httpd            #安装httpd软件
  9.                             - mariadb            #安装mariadb软件
  10.                             - mariadb-server      #安装mariadb-server
  11.           - name: wdwadas                  #第二个任务的描述信息
  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代表升级软件

Ansible 特殊模块并掌握自定义变量的方式

  • setup与debug模块
  • 各种常见的变量定义方式

Ansible特殊模块

setup模块

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

[root@control ansible]# ansible test -m setup

  • ansible_all_ipv4_addresses      #IP地址
  • ansible_bios_version         #主板BIOS版本
  • ansible_memtotal_mb    #总内存
  • ansible_hostname          #主机名
  • ansible_fqdn           #主机的域名
  • ansible_devices.vda.partitions.vda1.size #某个磁盘分区的大小

#部分内容

debug模块

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

---
- hosts: test
  tasks:
          - debug:
                  msg: "zhujimshi:{ { ansible_hostname }}"
          - debug:
                  msg: "zongneicundaxiao:{ { ansible_memtotal_mb}}"

  1. #调用debug模块显示某些具体的变量值
  2. #debug模块可以显示变量的值,可以辅助排错

 

定义变量的方法

Ansible支持十几种定义变量的方式

下面是根据优先级排序的定义方式:优先级低到高,如在1定义a=1在4定义a=11,那最终a=11

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

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

[root@control ansible]# vim ~/ansible/inventory            #主机清单
    [test]
    node1  iname="nb"                 #
在node1主机后面给该主机添加变量iname,值为nb.
    [proxy]
    node2
    [webserver]
    node[3:4]
    [webserver:vars]        #给webserver组定义变量,vars是关键词不可以改变,webserver是上面定义的组 
    iname="dachui"       #
给这个组定义变量iname="dachui"         
    [database]
    node5
    [cluster:children]
    webserver
    database

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

[root@control ansible]# vim ~/ansible/inventory_var.yml

---
- hosts: node1,webserver                       #定义需要远程管理的主机是谁
  tasks:                                                  #剧目要完成哪些任务
          - name: create a user with var          #剧目中的第一个任务描述信息
            user:                                                #调用user模块创建用户
                    name: "{ { iname }}"                  #需要创建的用户名是iname这个变量
[root@control ansible]# ansible-playbook ~/ansible/inventory_var.yml      #执行

  1. #在ansible剧本中当调用变量时,开始位置就调用变量,就需要在{ {}}外面加双引号
  2. #如果是在后面或者中间位置调用变量{ {}}外面可以不加双引号,也可以加双引号
  3.     "{ { iname }}"        "a{ { iname }}"        "a{ { iname }}a"    可以不加双引号

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

[root@control ansible]# vim ~/ansible/facts_var.yml

---
- hosts: test
  tasks:
          - name: create a user
            user:
                    name: "{ { ansible_hostname }}"

  1. #定义剧本,远程所有被管理主机,调用user模块,创建用户
  2. #需要创建的用户名ansible_hostname是一个ansible_facts变量
  3. # 到node1主机查看是否有一个与主机名同名的用户      [root@node1 ~]# id node1
                                                                                                     uid=1042(node1) gid=1042(node1) groups=1042(node1)

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

[root@control ansible]# vim ~/ansible/playbook_var.yml

---
- hosts: test
  vars:                       #vars是关键词,用来定义变量用的
          iname: heal        #具体变量名是iname,值是heal
          ipass: "123456"         #再定义一个变量名是ipass,值是123456,密码必须是字符串,需要引号
  tasks:                               #tasks定义需要执行的任务
          - name: Use variables           #给任务写个描述信息
            user:                            #调用user模块创建用户
                    name: "{ { iname }}"               #用户名的是前面定义的变量
                    password: "{ { ipass | password_hash('sha512') }}"            #密码是前面定义好的ipass,管道给password_hash把密码加密

[root@node1 ~]# id heal
uid=1043(heal) gid=1043(heal) groups=1043(heal)

单独定义个变量文件,在playbook中用vars_files调用该文件   (优先级最高)

[root@control ansible]# vim ~/ansible/variables.yml      #文件用来存变量

     ---
     iname: cloud
     ipass: '123456'

[root@control ansible]# vim ~/ansible/file_var.yml
     ---
     - hosts: test
       vars_files: variables.yml                      #当变量比较多时,专门定义一个文件用来存变量
       tasks:
               - name: create user
                 user:                             #调用user模块创建用户
                         name: "{ { iname }}"                           #用户名是变量文件variables.yml中定义的变量iname,密码也是变量文件中定义的变量
                         password: "{ { ipass | password_hash('sha512') }}"