2.ansible – playbook

时间:2020-8-31 作者:admin


文章目录

1.ansible – playbook

Ansible ad-hoc可以通过命令行形式远程管理其他主机,适合执行一些临时性简单任务。

另外还有一种远程管理的方式叫Playbook,Ansible Playbook中文名称叫剧本,它将经常需要执行的任务写入一个文件,这个文件就叫剧本。

  • 剧本中可以包含多个任务
  • 剧本写后,我们随时根据剧本,执行相关的任务命令
  • Playbook剧本要求按照YAML格式编写
  • 适合执行周期性经常执行的复杂任务

YAML语法和playbook写法

YAML是什么?

ansible的playbook采⽤yaml语法,它简单地实现了json格式的事件描述。yaml之于json就像markdown之于html⼀
样,极度简化了json的书写。

  • 以一个简单的playbook为例,说明yaml的基本语法
    • YAML是一个可读性高、用来表达数据序列的格式语言
    • YAML:YAML Ain’t a Markup Language
    • YAML以数据为中心,重点描述数据的关系和结构
---
- hosts: all                                 #hosts定义要远程谁?
  tasks:                               		 #tasks定义远程后要执行的任务有哪些?
      - name: This is my first playbook      #name后面的具体内容可以任意
        ping:

YAML的格式要求如下:

  1. 一般第一行为三个横杠—,以表明这是一个yaml文件 ,但即使没有使用 — 开头,也不会有什么影响
  2. “#“代表注释,可以注释整⾏,也可以注释⾏内从”#”开始的内容。
  3. 键值(key/value)对使用”:“表示,数组使用”-“表示
  4. key和value之间使用”:”分隔
  5. “:”后面必须有空格
  6. 一般缩进由两个或以上空格组成
  7. 相同层级的缩进必须对齐,缩进代表层级关系
  8. 全文不可以使用tab键
  9. 区分大小写
  10. 扩展名为yml或者yaml
  11. 跨行数据需要使用>或者|,其中|会保留换行符

列表

使⽤”- “(减号加⼀个或多个空格)作为列表项,也就是json中的数组。yaml的列表在playbook中极重要,必须得搞清楚它的写法。

  • 例如:
- zhangsan
- lisi
- wangwu

还⽀持内联写法:使⽤中括号。

[zhangsan,lisi,wangwu]

以上两种写法等价于json格式的:

[
   "zhangsan",
   "lisi",
   "wangwu"
]

在ansible playbook中,列表所描述的是 局部环境,它不⼀定要有名称,不⼀定要从同⼀个属性开始,只要使⽤”- “,它就表⽰圈定⼀个范围,范围内的项都属于该列表。

例如:

- 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

唯⼀要注意的是,每⼀个playbook中必须包含”hosts”和”tasks”项。更严格地说,是 每个play的顶级列表必须包含这两项。

playbook中某项是⼀个动作、⼀个对象或⼀个实体时,⼀般都定义成列表的形式。

字典

官⽅⼿册上这么称呼,其实就是key=value的另⼀种写法。使⽤”冒号+空格”分隔,即 key: value 。它⼀般当作列表项的属性。

具体到playbook中,⼀般”虚拟性”的内容都可以通过字典的⽅式书写,⽽实体化的、动作性的、对象性的内容则应该定义为列表形式。

---
- hosts: webserver
  tasks:
    - name: Add the user 'johnd' 
      user:						#调用user模块
        name: johnd				#创建用户johnd
        uid: 1040				#定义uid为1040
        group: daemon			#属于daemon组
        password: "{{ '123' | password_hash('sha512') }}"  	#密码为123

playbook和play的关系

⼀个playbook中可以包含多个play。每个play都⾄少包含有tasks和hosts这两项,还可以包含其他⾮必须项,如vars,vars_files,remote_user等。tasks中可以通过模块调⽤定义⼀系列的action。只不过,绝⼤多数时候,⼀个playbook都只定义⼀个play。

所以,⼤致关系为:

  • playbook: [play1,play2,play3]
  • play: [hosts,tasks,vars,remote_user…]
  • tasks: [module1,module2,…]

playbook中什么时候需要引号

playbook中定义的都是些列表和字典。绝⼤多数时候,都不需要使⽤引号,但有两个特殊情况需要考虑使⽤引号。

  • 出现⼤括号”{}”。

  • 出现冒号加空格时”: “。

⼤括号要使⽤引号包围,是因为不使⽤引号时会被yaml解析成内联字典。例如要使⽤⼤括号引⽤变量的时候,以及
想输出⼤括号符号的时候

---
- hosts: webserver
  tasks:
    - name: Add the user 'johnd' 
      user:						#调用user模块
        name: johnd				#创建用户johnd
        uid: 1040				#定义uid为1040
        group: daemon			#属于daemon组
        password: "{{ '123' | password_hash('sha512') }}"  	#密码为123

playbook的应用示例

Playbook基本使用

  1. 编写第一个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
  1. 定义多个主机和任务的剧本

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查看是否有该文件
  1. 多个play的Playbook文件
    [root@control ansible]# vim ~/ansible/test.yml
    #第一个play剧目
    ---
    - hosts: test
      tasks:
          - name: This is first play
            ping:
    #第二个play剧目
    - hosts: webserver
      tasks:
          - name: This is second play
            ping:

Playbook应用案例一:用户管理

  1. 用户管理,创建系统账户、账户属性、设置密码(参考ansible-doc user)
[root@control ansible]# vim  ~/ansible/test_john.yml
[root@control ansible]# cat ~/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算法加密
[root@control ansible]# ansible-playbook ~/ansible/test_john.yml
  1. 删除系统账户johnd,state的值设置为absent是删除用户
[root@control ansible]# vim ~/ansible/user_johnd.yml
---
- hosts: webserver
  tasks:
    - name: Remove the user 'johnd'
      user:
        name: johnd
        state: absent
#删除系统账户johnd,state的值设置为absent是删除用户

Playbook应用案例二:逻辑卷管理

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

参考帮助:ansible-doc parted,ansible-doc lvg,ansible-doc lvol

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

Playbook应用案例三:软件管理

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

[root@control ansible]# vim ~/ansible/package.yml
---
- hosts: webserver                        #需要远程的主机是谁
  tasks:                                   #定义剧本需要执行的任务
    - name: Install a list of packages  #第一个任务的描述信息 
      yum:                                 #调用yum模块安装软件
        name:                              #安装软件的名字,它的值有多个,使用数组-
          - httpd                          #安装httpd软件
          - mariadb                        #安装mariadb软件
          - mariadb-server                #安装mariadb-server
    - name: install the 'RPM Development Tools' package group   #第二个任务的描述信息
      yum:                                  #调用yum模块安装软件组包
        name: "@RPM Development Tools"        #安装哪个组包,@是关键词
    - name: update software               #第三个任务的描述信息
      yum:                                  #调用yum模块升级软件
        name: '*'                           #需要升级哪些软件
        state: latest                       #latest代表升级软件
#备注:state的值可以是(present|absent|latest)
#present代表安装软件(默认是present);absent代表卸载软件
#latest代表升级软件
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。