类似循环的写法 迭代循环 重复的事情
---
- hosts: all
remote_user: root
vars:
nginx_packages:
- htop
- sl
- hping3
tasks:
- name: create some file
file: name=/data/{{ item }} state=touch
with_items:
- file1
- file2
- file3
- name: install some packages
yum: name="{{ nginx_packages }}"
创建多个文件 安装多个软件
---
- hosts: all
remote_user: root
tasks:
- name: create some groups
group: name={{item}}
with_items:
- g1
- g2
- g3
- g4
- name: create some user
user: name={{item.name}} group={{item.group}}
with_items:
- { name: 'user1', group: 'g1' }
- { name: 'user2', group: 'g2' }
- { name: 'user3', group: 'g3' }
- { name: 'user4', group: 'g4' }
迭代嵌套子变量
创建多个用户属于对应的组
playbook中template for if
for
cat testfor.yml
---
- hosts: all
remote_user: root
vars:
ports:
- 81
- 82
- 83
tasks:
- name: cp conf
template: src=for1.conf.j2 dest=/data/for1.conf
cat templates/for1.conf.j2
{% for port in ports %}
server{
listen {{ port }}
}
{% endfor %}
ansible-playbook testfor.yml
ansible all -m shell -a 'cat /data/for1.conf'
server{
listen 81
}
server{
listen 82
}
server{
listen 83
}
cat testfor.yml
---
- hosts: all
remote_user: root
vars:
ports:
- web1:
port: 81
name: web1.com
rootdir: /data/web1
- web2:
port: 82
name: web2.com
rootdir: /data/web2
- web3:
port: 83
name: web3.com
rootdir: /data/web3
tasks:
- name: cp conf
template: src=for2.conf.j2 dest=/data/for2.conf
cat templates/for2.conf.j2
{% for p in ports %}
server{
listen {{ p.port }}
servername {{ p.name }}
docroot: {{ p.rootdir }}
}
{% endfor %}
ansible-playbook testfor.yml
ansible all -m shell -a 'cat /data/for2.conf'
server{
listen 81
servername web1.com
docroot: /data/web1
}
server{
listen 82
servername web2.com
docroot: /data/web2
}
server{
listen 83
servername web3.com
docroot: /data/web3
}
# 字典的感觉
if
---
- hosts: web
remote_user: root
vars:
ports:
- web1:
port: 81
name: web1.com
rootdir: /data/web1
- web2:
port: 82
#name: web2.com
rootdir: /data/web2
- web3:
port: 83
name: web3.com
rootdir: /data/web3
tasks:
- name: cp conf
template: src=for3.conf.j2 dest=/data/for3.conf
{% for p in ports %}
server{
listen {{ p.port }}
{% if p.name is defined %}
servername {{ p.name }}
{% endif %}
docroot: {{ p.rootdir }}
}
{% endfor %}
# 如果name被定义 就赋值 没定义 就不赋值 if
server{
listen 81
servername web1.com
docroot: /data/web1
}
server{
listen 82
docroot: /data/web2
}
server{
listen 83
servername web3.com
docroot: /data/web3
}
roles 角色
用于层次性,结构化的组织playbook.roles能够根据层次型结构自动装载变量文件,tasks,以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说通过分别将变量,文件,任务,模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景:建议使用roles 代码复用度高
**变更指定主机或主机组
**如命名不规范维护和传承成本大
**某些功能需要多个playbook 通过includes即可实现
####把不同的配置文件放在不同的目录里 条理清晰 模块化 便于管理和调用
角色roles:角色集合
roles各目录作用
/roles/project/:项目名称,有下面子目录
files/:存放由copy或者script模块等调用的文件
templates/:template模块查找所需要的模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.pyl的文件;其他的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
meta/:定义当前角色的特殊设定以及其依赖关系,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
default/:设定默认变量时使用此目录的main.yml文件
nginx_roles
nginx
1group:nginx
2user:nginx
3yum:nginx
4template:nginx.conf.j2
5service:nginx
整理 nginx 安装的一个基本步骤 再去定义
roles/
├── httpd
├── memcache
├── mysql
└── nginx
├── tasks
│ ├── group.yml
│ ├── main.yml
│ ├── restart.yml
│ ├── start.yml
│ ├── templ.yml
│ ├── user.yml
│ └── yum.yml
└── template
└── nginx.conf.j2
6 directories, 8 files
group.yml
- name: create group
group: name=nginx
restart.yml
- name: restart service
service: name=nginx state=restarted
start.yml
- name: start service
service: name=nginx state=started enabled=yes
templ.yml
- name: copy conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
user.yml
- name: create user
user: name=nginx group=nginx system=yes shell=/sbin/nologin
yum.yml
- name: install packge
yum: name=nginx
main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
cp /etc/nginx/nginx.conf roles/nginx/template/nginx.conf.j2
nginx_role.yml (和roles在同一级目录下)
---
- hosts: web
remote_user: root
roles:
- role: nginx
ansible-playbook -C nginx_role.yml
ansible-playbook nginx_role.yml
# 将playbook的需要的操作 模块化 方便调用