关于 Ansible 系列其他文章的传送门
-
《 Ansible 介绍和基础操作 》
-
《 Ansible Playbook 以及 Roles 的简单使用方法 》 您当前所在位置
-
《 使用 Ansible Playbook 通过 yum 部署 LNMP 环境 》
-
《 使用 Ansible Roles 快速搭建 Nginx 代理后端的 LAMP 模型 》
-
《 使用 Ansible Playbook 自动完成硬盘的分区、格式化、挂载 》

一、Ansible Playbook
使用 YAML 或者 json 格式编写剧本(Playbook),剧本中定义了各种 task,按照要求和条件执行
YAML(/ˈjæməl/,尾音类似 camel 骆驼)是一个可读性高,用来表达数据序列化的格式。YAML 参考了其他多种语言,包括:C 语言、Python、Perl,并从 XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans 在 2001 年首次发表了这种语言,另外 Ingy döt Net 与 Oren Ben-Kiki 也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
1. Playbook 的核心元素
- hosts:主机
- tasks:任务列表
- templates:包含了模板语法的文本文件
- handlers:由特定条件触发的任务
2. 运行 Playbook 的方式
- 检查语法
ansible-playbook --syntax-check
- 测试可能发生的改变,并不真的执行
ansible-playbook --check
- 运行playbook
ansible-playbook nginx.yml
3. Playbook 的基本使用方法
先定义 yml 文件,比如 nginx.yml
vim nginx.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| - hosts: remote_user: sudo_user:
vars: - var1: value1 - var2: value2
tasks: - name: yum install nginx yum: name=nginx state=installed
- name: copy nginx conf template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=nginx mode=644
notify: name= "restart nginx"
tags: - copy nginx conf
handlers: - name: "restart nginx" service: name=nginx state=restarted
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| - hosts: webserver remote_user: ubuntu sudo_user: root
tasks: - name: install nginx yum: name=nginx state=present
- name: install conf file template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx tags: - install_config
- name: start nginx service service: name=nginx state=started
handlers: - name: restart nginx service: name=nginx state=restarted
|
4. 条件测试
when 语句:在 task 中使用,jinja2 的语法格式
1 2 3 4 5 6 7 8
| tasks: - name: install conf file to centos7 template: src=files/nginx.conf.c7.j2 when: ansible_distribution_major_version == "7"
- name: install conf file to centos6 template: src=files/nginx.conf.c6.j2 when: ansible_distribution_major_version == "6"
|
5. 循环
迭代,需要重复执行的任务,对迭代项的引用,固定变量名为 item, 而后,要在 task 中使用 with_items 给定要迭代的元素列表;
语法:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| - name: install some packages yum: name={{ item }} state=present with_items: - nginx - memcached - php-fpm
- name: add some groups group: name={{ item }} state=present with_items: - group11 - group12 - group13
- name: add some users user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name: 'user11', group: 'group11' } - { name: 'user12', group: 'group12' } - { name: 'user13', group: 'group13' }
|
二、角色(Roles)

角色集合,先定义角色
1 2 3 4 5
| roles/ mysql/ httpd/ nginx/ memcached/
|
每个角色,以特定的层级目录结构进行组织
1 2 3 4 5 6 7 8
| mysql/ files/ templates/ tasks/ handlers/ vars/ meta/ default/
|
调用角色
在 playbook 调用角色方法 1:
1 2 3 4 5 6
| - hosts: websrvs remote_user: root roles: - mysql - memcached - nginx
|
在 playbook 调用角色方法 2:传递变量给角色
1 2 3 4
| - hosts: remote_user: roles: - {role: nginx, username: nginx}
|