playbook
文章目录
1. 实施playbook
1.1 ansible playbook与临时命令
- 临时命令作为一次性命令对一组目标主机运行一项简单的任务,playbook对一组目标主机执行多项复杂的任务
- playbook是一组文本文件,play对清单中选定的主机运行一组有序任务
- playbook是ansible用于配置,部署,和管理被控节点的剧本
1.2 playbook语法特性
- 以三个- - -(减号)开始,必须顶行写
- 次行写playbook的内容,一般要求写明该playbook的功能
- 严格缩进,不允许使用tab键缩进
- playbook使用空格字符缩进来表示数据结构,同一级别的数据元素必须有相同缩进量,项目的子项必须大于父项
- K/V的值可同行写,可换行写,同行使用分隔,换行以-分隔
1.3 playbook基础组件
Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表
handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
templates:使用模板语言的文本文件,使用jinja2语法
variables:变量,变量替换
2 playbook的使用
2.1 运行playbook
playbook运行时,屏幕会输出每个play和任务的name键的值(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务)对与含有多个play和任务的playbook,设置name属性后方便监控playbook执行的进展
playbook中的任务是幂等的,能够安全的多次运行playbook,如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。
2.2 实施一个play任务
//编写一个单任务
[root@my ~]# cd /etc/ansible/
[root@my ansible]# mkdir playbook //创建目录
[root@my ansible]# cd playbook/
[root@my playbook]# vim user.yml //编辑文件
[root@my playbook]# cat user.yml
--- //分隔符
- name: task1 //任务的名字
gather_facts: no //
hosts: 192.168.47.147 //执行任务的主机
tasks: //任务
- name: create user for my //执行任务的名字
user: //使用的用户模块
name: my //用户的名字
uid: 4000 //指定用户的uid
state: present //指定用户的状态
//语法验证--syntax-check
[root@my playbook]# ansible-playbook --syntax-check user.yml
playbook: user.yml
2.3 空运行
使用-C选项对playbook执行空运行。这会使ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改
[root@my playbook]# ansible-playbook -C user.yml
PLAY [task1] ******************************************************************************
TASK [create user for my] *****************************************************************
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@my playbook]# ansible-playbook user.yml
PLAY [task1] ******************************************************************************
TASK [create user for my] *****************************************************************
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 my
uid=4000(my) gid=1000(my) 组=1000(my)
3 实施多个play
Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。
在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play
3.1 编写并运行playbook
[root@my playbook]# vim vsftpd.yml
[root@my 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@my playbook]# ansible-playbook --syntax-check vsftpd.yml
playbook: vsftpd.yml
[root@my 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 my
uid=4000(my) gid=1000(my) 组=1000(my)
[root@node1 ~]# echo 1 | passwd --stdin my
更改用户 my 的密码 。
passwd:所有的身份验证令牌已经成功更新。
//生成密钥
[root@my playbook]# ssh-copy-id my@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
my@192.168.47.147's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'my@192.168.47.147'"
and check to make sure that only the key(s) you wanted were added.
//权限委派
[root@my playbook]# visudo
root ALL=(ALL) ALL
my ALL=(ALL) NOPASSWD: ALL
[root@my playbook]# cat test.yml
---
- hosts: apache
remote_user: my
become: yes
tasks:
- name: create user yao
user:
name: yao
state: present
[root@my playbook]# ansible-playbook --syntax-check test.yml
playbook: test.yml
[root@my 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@my 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@my playbook]# mkdir files
[root@my playbook]# ls
files inventory test.yml user.yml vsftpd.yml
[root@my playbook]# cd files/
[root@my files]# cp /etc/hosts .
[root@my files]# ls
hosts
[root@my files]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@my files]# vim hosts
[root@my 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@my files]# cd ..
[root@my playbook]# vim test.yml
[root@my playbook]# cat test.yml
---
- hosts: apache
remote_user: my
become: yes
tasks:
- name: sync hosts file
copy:
src: files/hosts
dest: /etc/hosts
[root@my 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 语法变化
语法 | 作用 |
---|---|
YAML注释 | 用于提高可读性,在YAML中,编号或井号字符(#)右侧的所有内容都是注释;如果注释的左侧有内容,请在该编号符号的前面加一个空格 |
YAML字符串 | YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起;编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符;要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性 |
YAML字典 | 字典也可以使用以大括号括起的内联块格式编写;大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量 |
YAML列表 | 列表也有以中括号括起的内联格式;我们应该避免使用此语法,因为它通常更难阅读 |