一、for循环
语法
{% for i in LIST %}
...
{% endfor %}
示例-1
for-1.yml
文件内容
---
- hosts:websrvs
remote_user: root
vars:
ports:
- 80
- 81
- 82
#定义了一个变量ports,三个值分别是80、81、82
tasks:
- name: Create Config
template: src=for-1.conf.j2 dest=/data/for-1.conf
#拷贝模板文件到受控主机
for-1.conf.j2
文件内容
{% for i in ports %}
server {
listen {{ i }};
}
{% endfor %}
#将会生成三段都这样的内容
结果:
server {
listen 80;
}
server {
listen 81;
}
server {
listen 82;
}
示例-2
for-2.yml
文件内容
---
- hosts: websrvs
remote_user: root
vars:
ports:
- port: 80
- port: 81
- port: 82
#变量中定义了键值,port为键,80为值
tasks:
- name: Create Config
template: src=for-2.conf.j2 dest=/data/for-2.conf
#拷贝模板文件到受控主机
for-2.conf.j2
文件内容
{% for i in ports %}
server {
listen {{ i.port }};
}
{% endfor%}
#注意的是要引用对应的键值,需要加上键的名称,结果和上一种相同
示例-3
在示例-2上我们可以看到使用了键值对,下面进行扩展使用
for-3.yml
文件内容
---
- hosts: wensrvs
remote_user: root
vars:
server:
- web1:
port: 80
hostname: web1.beijixs.cn
root: /data/website1
- web2:
port: 81
hostname: web2.beijixs.cn
root: /data/website2
- web3:
port: 82
hostname: web3.beijixs.cn
root: /data/website3
#变量server 定义了多个键值(字典)
tasks:
- name: Copy Config
template: src=for-3.conf.j2 dest=/data/code/for-3.conf
for-3.conf.j2
文件内容
{% for i in server %}
server {
listen {{ i.port }};
server_name {{ i.hostname }};
root {{ i.root }};
}
{% endfor %}
# {{ i.key }}这样指定键
最后运行的结果就是:
server {
listen 80;
server_name web1.beijixs.cn;
root /data/website1;
}
server {
listen 81;
server_name web2.beijixs.cn;
root /data/website2;
}
server {
listen 82;
server_name web3.beijixs.cn;
root /data/website3;
}
二、if条件语句
语法
{% if NAME is defined %} #如果变量"NAME"被定义,就执行以下语句块;否则不执行
...
{% endif %}
示例-1
借助上面的for-3
示例进行测试:if-1.yml
文件内容:
---
- hosts: wensrvs
remote_user: root
vars:
server:
- web1:
port: 80
#hostname: web1.beijixs.cn
#注释掉部分的hostname的键值
root: /data/website1
- web2:
port: 81
#hostname: web2.beijixs.cn
#注释掉部分的hostname的键值
root: /data/website2
- web3:
port: 82
hostname: web3.beijixs.cn
root: /data/website3
#变量server 定义了多个键值(字典)
tasks:
- name: Copy Config
template: src=if-1.conf.j2 dest=/data/code/if-1.conf
配置文件if-1.conf.j2
内容:
{% for i in server %}
server {
listen {{ i.port }};
{% if i.hostname is defined %} #表示hostname被定义了就加入下面的语句
server_name {{ i.hostname }};
{% endif %} #if结束
root {{ i.root }};
}
{% endfor %}
测试结果为:
server {
listen 80;
root /data/website1;
}
server {
listen 81;
root /data/website2;
}
server {
listen 82;
root /data/website3;
server_name web3.beijixs.cn;
}
前两个server都没有server_name
;因为他们对于的键没有被定义;
<center>趁阳光正好</center>
<center>趁微风不噪</center>
<center>趁繁花还未开至荼蘼</center>
<center>趁现在还年轻</center>
<center>还可以走很长很长的路</center>
<center>还能诉说很深很深的思念</center>
<center>可是她不知道还想她!</center>