playbook
简介
playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等等,在shell脚本中是一条一条的命令,而在playbook中是一个一个的task任务构成,每个task任务可以看做shell中的一条命令;shell脚本一般只是在当前服务器上执行,而playbook则是在不止一个服务器上执行,因此playbook需要在其中指定运行该playbook的服务器名
语法结构
项目 | Value |
-u | REMOTE_USER, --user=REMOTE_USER |
ssh | 连接的用户名 |
-k, | –ask-pass |
ssh | 登录认证密码 |
-s | –sudo |
sudo | 到root用户,相当于Linux系统下的sudo命令 |
-U SUDO_USER | –sudo-user=SUDO_USER |
sudo | 到对应的用户 |
-K | –ask-sudo-pass #用户的密码(—sudo时使用) |
-T TIMEOUT | –timeout=TIMEOUT |
ssh | 连接超时,默认 10 秒 |
-C,–check | 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改 |
-e EXTRA_VARS | –extra-vars=EXTRA_VARS |
设置额外的变量如 | key=value 形式 或者 YAML or JSON,以空格分隔变量 |
-f FORKS | –forks=FORKS |
-i INVENTORY | –inventory-file=INVENTORY |
指定 hosts | 文件路径 |
-l SUBSET | –limit=SUBSET |
指定一个 pattern | 对- hosts:匹配到的主机再过滤一次 |
–list-hosts | 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook |
–list-tasks | 列出该 playbook 中会被执行的 task |
–private-key=PRIVATE_KEY_FILE | 私钥路径 |
–step | 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍 |
–syntax-check | 只检测 playbook 文件语法是否有问题,不会执行该 playbook |
-t TAGS | –tags=TAGS #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔 |
–skip-tags=SKIP_TAGS | 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行 |
-v, --verbose | 输出更详细的执行过程信息,-vvv可得到所有执行过程信息 |
检查MySQL的运行状态
[root@test2 playbook]# cat test.yml
---
- hosts: all
remote_user: root
gather_facts: no #不收集对应主机的信息,这样运行会快点。
tasks:
- name: check the mysql stauts
service: name=mysqld state=running
运行结果:
[root@test2 playbook]# ansible-playbook test.yml
PLAY [all] ********************************************************************
TASK: [check the mysql stauts] ************************************************
ok: [10.0.102.200]
ok: [10.0.102.162]
ok: [10.0.102.212]
PLAY RECAP ********************************************************************
10.0.102.162 : ok=1 changed=0 unreachable=0 failed=0
10.0.102.200 : ok=1 changed=0 unreachable=0 failed=0
10.0.102.212 : ok=1 changed=0 unreachable=0 failed=0
限定主机范围执行
虽然playbook中定义了执行的主机,但是有时候我们可能仅想在定义的主机中的部分机器上执行,这时候怎么办?修改playbook中的hosts的范围,但是每次改变主机就修改一次,比较麻烦,我们可以使用–limit参数,指定该playbook在指定的主机上执行。有以下inventory文件,我们想在dbservers上执行上面测试用的playbook内容
[all]
10.0.102.212
10.0.102.200
10.0.102.162
[dbservers]
10.0.102.162
上面测试的playbook中hosts定义all,我们想仅在dbservers上执行
[root@test2 playbook]# ansible-playbook test.yml --limit dbservers
PLAY [all] ********************************************************************
TASK: [check the mysql stauts] ************************************************
ok: [10.0.102.162]
PLAY RECAP ********************************************************************
10.0.102.162 : ok=1 changed=0 unreachable=0 failed=0
ansibleplaybook中的handlers
在系统中,我们修改了服务器的配置文件,这时候就需要重启操作服务,就可以使用到handlers
handlers: #下面定义了两个handlers
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf #修改了配置文件然后依次启动memcached和apache服务。
notify: #使用notify来声明引用handlers。
- restart memcached
- restart apache