相关阅读 Ansible 安装配置及常用命令
Ansible Playbook 介绍
可以理解为把需要用到的 ansible 模块写入到配置文件里面,然后执行配置文件就可以完成分复杂的工作。类比在 Linux 系统下的 shell 脚本,比如 shell 安装 LANMP。
编写playbook 一
# vim /etc/ansible/test.yml
---
- hosts: testhosts
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/lishiming.txt
playbook 文件以 yml 结尾
--- 为固定格式,不能省略,包括 host 前面的 -
hosts 指定主机的组或者ip
remote_user 指定远程执行命令的用户,也可以只写 user
tasks 指定任务,先对任务进行命名,再写要执行的命令
name 对任务进行一个描述,执行过程中会打印出来
shell 具体要执行的命令。
格式要求很严格,hosts 和 remote_user 一定要首字母对其,下面的 name 和 shell 也要整齐,减号是对下面所有的参数起作用,如果没有整齐,那么语法会有错误。下图已经用 here 指出来。
执行 playbook
# ansible-playbook test.yml
编写playbook 二
# vim /etc/ansible/creat_users.yml
---
- name: create_user
hosts: testhosts
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: creat user
user: name="{{ user }}"
gater_facts 参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,ansible testhosts -m setup 在命令行执行 setup 模块可查看相关信息。这些信息可以作为一个判断条件,在后面的task会使用到setup获取的信息。比如判断系统是 ubuntu 还是 centos,然后选择是执行 apt-get 还是 yum。
var 指定变量,定义 user 用户变量,值为test ,需要注意的是,变量值一定要用引号引住。在 playbook 里面用两个花括号来引用变量,需要有空格 {{ 变量 }}。
tasks 指定任务,
- name 定义任务的描述,
user 调用 user 模块
用ansible-doc user 查看命令帮助选项。= name Name of the user to create, remove or modify.
playbook 中的循环
playbook 类似 shell ,支持循环以及判断等特殊格式。
需求针对 file 文件,修改 /tmp 目录下 1.txt 2.txt 的权限,owner 以及 group。做个遍历循环,核心是 item 以及下面的 with_item 选项,为 ansible 的固定结构。
# vim /etc/ansible/loop.yml
---
- hosts: testhosts
user: root
tasks:
- name: change mod for file
file: path=/tmp/{{ item }} mode=600 owner=test group=root
with_items:
- 1.txt
- 2.txt
file 后面的 user 和 group 可以不用写,上面已经定义了 user
with_item 下面的 1.txt 和 2.txt 后面千万不能跟空格,空格也会被识别为文件的一部分。
核心部分就是 {{ item }} 以及下面的 with_items:
playbook 中的判断
playbook 类似 shell ,支持循环以及判断等特殊格式。
判断的关键选项 when
# vim /etc/ansible/when.yml
---
- hosts: testhosts
remote_user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: facter_ipaddress == "192.168.32.150"
gather_facts 这里用到的信息是来判断 ip 地址是不是 192.168.32.150
when 就是执行条件,facter_ipaddress 就是通过 gather_facts 得到的信息,ansible testhosts -m setup 命令行执行可查看信息。facter_ipaddress 已经不再支持,需要更改为 ansible_eth0.ipv4.address
playbook 的特性 handlers
handlers 的目的是在执行完成 tasks 之后,还需要进行其他的操作时,使用 handlers。但是这里需要保证只有在 tasks 执行成功之后,handlers 才会生效。
这种比较适合配置文件发生更改后,自动重启服务的操作。
# vim /etc/ansible/handlers.yml
---
- hosts: testhosts
remote_user: root
tasks:
- name: test copy
copy: src=/tmp/1.txt dest=/tmp/2.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "121212" >> /tmp/2.txt
关键点在于 notify,在 copy 成功之后,执行 handlers,notify 后面的名字,对应的是 handlers 选项中的 - name 选项,如果没有写 notify,就不会执行 handlers 里面的命令。
NOTE: copy 有个特性,和 rsync 类似,如果拷贝的两个文件内容一模一样,那就就不会进行拷贝的操作,在这个 handlers 的文件中,也就不会去执行 handlers 的操作。