一、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;因为他们对于的键没有被定义;


趁阳光正好
趁微风不噪
趁繁花还未开至荼蘼
趁现在还年轻
还可以走很长很长的路
还能诉说很深很深的思念

可是她不知道还想她!

Hello World

最后修改:2019 年 10 月 20 日 03 : 37 PM
如果觉得我的文章对你有用,请随意赞赏