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