playbook 的使用

1. playbooks介绍

1.1 ansible playbook与临时命令

1.2 playbooks基础组件

1.3 Playbook语法

1.4 语法变化

2. playbook的使用

2.1 运行playbook

2.2 实施一个play任务

2.3 空运行

2.4 运行playbook

3. 实施多个play

3.1 编写并运行playbook

3.2 用户属性+权限属性

3.3 查找模块

3.4 提高输出的详细程度


1. playbooks介绍

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
 

1.1 ansible playbook与临时命令

  • 临时命令作为一次性命令对一组目标主机运行一项简单的任务,playbook对一组目标主机执行多项复杂的任务
  • playbook是一组文本文件,play对清单中选定的主机运行一组有序任务
  • playbook是ansible用于配置,部署,和管理被控节点的剧本
     

1.2 playbooks基础组件

  • Hosts:运行执行任务(task)的目标主机
  • remote_user:在远程主机上执行任务的用户
  • tasks:任务列表
  • handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
  • templates:使用模板语言的文本文件
  • variables:变量,变量替换

1.3 Playbook语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task

1.4 语法变化

语法

作用

YAML注释

用于提高可读性,在YAML中,编号或井号字符(#)右侧的所有内容都是注释;如果注释的左侧有内容,请在该编号符号的前面加一个空格

YAML字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起;编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符;要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性

YAML字典

字典也可以使用以大括号括起的内联块格式编写;大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量

YAML列表

列表也有以中括号括起的内联格式;我们应该避免使用此语法,因为它通常更难阅读

2. playbook的使用

2.1 运行playbook

playbook运行时,屏幕会输出每个play和任务的name键的值(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务)对与含有多个play和任务的playbook,设置name属性后方便监控playbook执行的进展

playbook中的任务是幂等的,能够安全的多次运行playbook,如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。

2.2 实施一个play任务

//编写一个单任务
[root@yibie ~]# cd /etc/ansible/
[root@yibie ansible]# mkdir playbook //创建目录
[root@yibie ansible]# cd playbook/
[root@yibie playbook]# vim user.yml //编辑文件
[root@yibie playbook]# cat user.yml 
---  //分隔符
- name: task1   //任务的名字
  gather_facts: no  //
  hosts: 192.168.47.147  //执行任务的主机
  tasks:  //任务
    - name: create user for yibie //执行任务的名字
      user:  //使用的用户模块
        name: yibie //用户的名字
        uid: 4000  //指定用户的uid
        state: present //指定用户的状态

验证

//语法验证--syntax-check
[root@yibie playbook]# ansible-playbook --syntax-check user.yml
playbook: user.yml

2.3 空运行

使用-C选项对playbook执行空运行。这会使ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。

[root@yibie playbook]# ansible-playbook -C user.yml

PLAY [task1] ******************************************************************************

TASK [create user for yibie] *****************************************************************
changed: [192.168.47.147]

PLAY RECAP ********************************************************************************
192.168.47.147             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2.4 运行playbook

[root@yibie playbook]# ansible-playbook user.yml

PLAY [task1] ******************************************************************************

TASK [create user for yibie] *****************************************************************
changed: [192.168.47.147]

PLAY RECAP ********************************************************************************
192.168.47.147             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@node1 ~]# id yibie
uid=4000(yibie) gid=1000(yibie) 组=1000(yibie)

3. 实施多个play

Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。

在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play

3.1 编写并运行playbook

[root@yibie playbook]# vim vsftpd.yml
[root@yibie playbook]# cat vsftpd.yml 
---
- hosts: apache
  tasks:
    - name: insatll vsftpd
      yum: 
        name: vsftpd
        state: latest
    - name: start servrice for vsftpd
      service:
        name: vsftpd
        state: started
        enabled: yes
[root@yibie playbook]# ansible-playbook --syntax-check vsftpd.yml

playbook: vsftpd.yml
[root@yibie playbook]# ansible-playbook -C vsftpd.yml

PLAY [apache] *****************************************************************************

TASK [Gathering Facts] ********************************************************************
ok: [192.168.47.147]

TASK [insatll vsftpd] *********************************************************************
ok: [192.168.47.147]

TASK [start servrice for vsftpd] **********************************************************
changed: [192.168.47.147]

PLAY RECAP ********************************************************************************
192.168.47.147             : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
[root@node1 ~]# rpm -qa | grep vsftpd
vsftpd-3.0.3-31.el8.x86_64

3.2 用户属性+权限属性

远程连接普通用户

//创建用户,设置密码
[root@node1 ~]# id yibie
uid=4000(yibie) gid=1000(yibie) 组=1000(yibie)
[root@node1 ~]# echo 1 | passwd --stdin yibie
更改用户 yibie 的密码 。
passwd:所有的身份验证令牌已经成功更新。
//生成密钥
[root@yibie playbook]# ssh-copy-id yibie@192.168.47.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
yibie@192.168.47.147's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'yibie@192.168.47.147'"
and check to make sure that only the key(s) you wanted were added.
//权限委派
[root@yibie playbook]# visudo
root    ALL=(ALL)       ALL
yibie      ALL=(ALL)      NOPASSWD: ALL
[root@yibie playbook]# cat test.yml 
---
- hosts: apache
  remote_user: yibie
  become: yes
  tasks:
   - name: create user yao
     user:
       name: yao
       state: present
[root@yibie playbook]# ansible-playbook --syntax-check test.yml
playbook: test.yml
[root@yibie playbook]# ansible-playbook test.yml

PLAY [apache] *****************************************************************************

TASK [Gathering Facts] ********************************************************************
ok: [192.168.47.147]

TASK [create user yao] ********************************************************************
changed: [192.168.47.147]

PLAY RECAP ********************************************************************************
192.168.47.147             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.3 查找模块

使用ansible-doc【module name】命令来显示模块的详细文档
应尽量避免在playbook中使用command、shell和raw模块,因为它们可以取胜任意命令,因此使用这些模块时很容易写出非幂等的playbook

[root@yibie playbook]# ansible-doc user

非幂等的模块
copy模块可以测试来了解是否达到了需要的状态,如果已达到,则不进行任何更改。shell模块容许非常大的灵活性,但需要格外小心,从而确保它以幂等方式运行。

幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正确的系统。

[root@node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@yibie playbook]# mkdir files
[root@yibie playbook]# ls
files  inventory  test.yml  user.yml  vsftpd.yml
[root@yibie playbook]# cd files/
[root@yibie files]# cp /etc/hosts .
[root@yibie files]# ls
hosts
[root@yibie files]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@yibie files]# vim hosts 
[root@yibie files]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.47.129 apache
[root@yibie files]# cd ..
[root@yibie playbook]# vim test.yml
[root@yibie playbook]# cat test.yml 
---
- hosts: apache
  remote_user: yibie
  become: yes
  tasks:
   - name: sync hosts file
     copy:
       src: files/hosts
       dest: /etc/hosts
[root@yibie playbook]# ansible-playbook test.yml 

PLAY [apache] *****************************************************************************

TASK [Gathering Facts] ********************************************************************
ok: [192.168.47.147]

TASK [sync hosts file] ********************************************************************
changed: [192.168.47.147]

PLAY RECAP ********************************************************************************
192.168.47.147             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.47.129 apache

3.4 提高输出的详细程度

ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别。

配置Playbook执行的输出详细程序

选项

描述

-v

显示任务结果

-vv

任务结果和任务配置都会显示

-vvv

包含关于与受管主机连接的信息

-vvvv

增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本