一、 模板 templates
本质是嵌套有脚本(使用模板编程语言Jinja2编写)的文本文件,借助模板生成真正的配置文件。
1. Jinja2语言
使用字面量,有下面形式:
- 字符串:使用单引号或双引号
- 数字:整数,浮点数
- 列表:[item1, item2, ...]
- 元组:(item1, item2, ...)
- 字典:{key1:value1, key2:value2, ...}
- 布尔型:true/false
- 算术运算:+, -, *, /, // 整除, %, **
- 比较操作:==, !=, >, >=, <, <=
- 逻辑运算:and,or,not
- 流表达式:For,If,When
2. template 的使用
- template文件必须存放于templates目录下,且命名为 .j2 结尾
- yaml/yml 文件需和templates目录平级,目录结构如下:
├── temnginx.yml
└── templates
└── nginx.conf.j2
示例:利用template 同步nginx配置文件
- 准备模板文件(从nginx原配置文件复制)
cp nginx.conf templates/nginx.conf.j2
- 替换nginx.conf.j2中某些参数值为变量
worker_processes {{ ansible_processor_vcpus }};
也可以用运算操作,例如
worker_processes {{ ansible_processor_vcpus**2 }};
worker_processes {{ ansible_processor_vcpus+2 }};
- 编写playbook
vim temnginx.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: template config to remote hosts
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
其中 template部分含义就是将nginx.conf.j2参数的变量值替换后,复制到目标主机并更名为nginx.conf。例如本例是将worker_processes参数值根据各目标主机cpu数 {{ ansible_processor_vcpus }} 值进行替换并生成Nginx配置文件。
二、 条件判断 when
在task后添加when子句即可使用条件判断
tasks:
- name: "shutdown RedHat flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "RedHat" # 当系统属于红帽系列,执行command模块
多个条件判断
tasks:
- name: install conf file to centos7
template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "6"
三、 循环 with_items
当有需要重复性执行的任务时,可以使用循环。对循环项的引用,固定变量名为"item"。
要在task中使用with_items给定要迭代的元素列表,列表格式可以是字符串或者字典。
示例1:创建用户,item为字符串
---
- name: add several users
user: name={{ item }} state=present groups=wheel # {{ item }} 系统自定义变量
with_items: # 定义{{ item }} 的值和个数
- testuser1
- testuser2
上面语句的功能等同于下面的语句:
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=testuser2 state=present groups=wheel
示例2:创建用户,item为字典
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }
示例3:创建组和用户
---
- hosts:websrvs
remote_user: root
tasks:
- name: add some groups
group: name={{ item }} state=present
with_items:
- group1
- group2
- group3
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user1', group: 'group1' }
- { name: 'user2', group: 'group2' }
- { name: 'user3', group: 'group3' }
四、 综合案例
template中使用 for if when
vi templates/nginx.conf.j2
# 按照nginx_vhosts 列表生成listen 参数值
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost }}
}
{% endfor %}
vi temnginx.yml
---
- hosts: mageduweb
remote_user: root
vars:
nginx_vhosts:
- web1
- web2
- web3
tasks:
- name: template config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
生成的结果:
server {
listen web1
}
server {
listen web2
}
server {
listen web3
}
参考
《ansible权威指南》
https://www.bilibili.com/video/BV1HZ4y1p7Bf?from=search&seid=13215158654353304589&spm_id_from=333.337.0.0