循环

迭代:with_items

标准循环

以创建多个文件和用户为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
- hosts: centos
remote_user: root
tasks:
- name: touch some files.
file: name=/data/{{ item }} state=touch
with_items:
- file1
- file2
- name: add several users.
user: name={{ item.usrname }} groups={{ item.groups }} state=present
with_items:
- { usrname: 'user1',groups: 'root'}
- { usrname: 'user2',groups: 'root'}

嵌套循环

循环也可以嵌套:

1
2
3
4
5
- name: give users access to multiple databases
mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
with_nested:
- [ 'alice', 'bob' ]
- [ 'clientdb', 'employeedb', 'providerdb' ]

和以上介绍的’with_items’一样,你也可以使用预定义变量.:

1
2
3
4
5
- name: here, 'users' contains the above list of employees
mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
with_nested:
- "{{users}}"
- [ 'clientdb', 'employeedb', 'providerdb' ]

Playbook中template for if

for循环和if条件判断的语法格式

1
2
3
4
5
6
7
{% for x in list %}
expression
{% endfor %}

{% if bool %}
expression
{% endif %}

案例

1
2
3
4
5
6
7
8
9
10
11
---
- hosts: centos
remote_user: root
vars:
ports:
- 80
- 81
- 82
tasks:
- name: copy conf
template: src=for1.conf.j2 dest=/data/for1.conf
1
2
3
4
5
{% for port in ports %}
server{
listen {{ port }}
}
{% endfor %}

补充:yaml中vars变量还可以采用列表嵌套字典的方式,定义更多的键值对。

role

Roles 的概念来自于这样的想法:通过 include 包含文件并将它们组合在一起,组织成一个简洁、可重用的抽象对象。这种方式可使你将注意力更多地放在大局上,只有在需要时才去深入了解细节。

  • role提高了playbook的复用率

role的推荐目录为/etc/ansible/roles

1
2
3
4
roles/
├── httpd
├── memcache
└── mysql

场景模拟

ansible-role-tree

目录编排

每个角色,以特定的层级目录结构进行组织。

roles 目录结构: playbook.yml roles/ project/ tasks/ files/ vars/ templates/ handlers/ default/ meta/

Roles 各目录作用: roles/project/ :项目名称,有以下子目录

  • files/ :存放由 copy 或 script 模块等调用的文件
  • templates/:template 模块查找所需要模板文件的目录
  • tasks/:定义 task,role 的基本元素,至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含
  • handlers/:至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含
  • vars/:定义变量,至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含
  • meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为 main.yml 的文件,其它文件需在此文件中通过 include 进行包含
  • default/:设定默认变量时使用此目录中的 main.yml 文件,比 vars 的优先级低

注意

未来使用playbook调用role时,要将playbook文件放在role平级目录下

需要实现一个nginx的role

思路

  1. 创建组nginx
  2. 创建用户nginx
  3. 安装nginx
  4. 使用模板文件,修改配置
  5. 启动service

首先

1
mkdir /etc/ansible/roles/nginx