ansible-play中for,if的使用

#迭代循环的使用
#实现同时新建三个文件,同时部署三个服务
---
- host: websrvs
  remote_user: root
  
  task:
    - name: create some files
      file: name=/data/{{ item }} state=touch          #item=变量
      when: ansible_distribution_major_version == "7"
      with_items:                                      #with_items=变量列表
        - file1
        - file2
        - file3
    - name: install some pakcages
      yum: name={{ item }} state=started enabled=yes
      with_items:
        - httpd
        - nginx
        - vsftp

        
################################################################################


#迭代嵌套子变量
#实现新建三个用户三个组,三个用户分别归属于三个不同组
---
- host: websrvs
  remote_user: root
  
  task:
    - name: create some groups
      group: name={{ item }}   
      when: ansible_distribution_major_version == "7"
      with_items:                                   
        - g1
        - g2
        - g3
    - name: create some users
      user: name={{ item.name }} group={{ item.group }}
      with_items:
        - { name: 'user1', group: 'g1' }
        - { name: 'user2', group: 'g2' }
        - { name: 'user3', group: 'g3' }
        
###################################################################################
#for循环
---
- host: websrvs
  remote_user: root
  vars:
    ports:         #ports为变量名称,其中包含了一个量变列表
      - 81
      - 82
      - 83
  tasks:
    - name: copy conf
      tmplate: src=for1.conf.j2 dest=/data/for1.conf

#==============================
#for1.conf.j2配置文件
{% for port in ports %}    #port为变量,从已经定义的ports变量列表中取值
server{
        listen {{ port }}  #port作为变量,用括号表示
}
{% endfor %}               #以for开头,对应以endfor结尾
最终实现结果:
server{
        listen 81
}
server{
        listen 82
}
server{
        listen 82
}

############################################################################
#for循环进阶应用,键值对
---
- host: websrvs
  remote_user: root
  vars:
    ports:         #ports为变量名称,其中包含了一个量变列表
      - web1:
        port: 8080
        name: web1.shykoo.com
      - web2:
        port: 8081
        name: web2.shykoo.com
      - web1:
        port: 8082
        name: web3.shykoo.com
  tasks:
    - name: copy conf
      tmplate: src=for2.conf.j2 dest=/data/for2.conf
#===============================
#for2.conf.j2配置文件
{% for P in ports %}    #P为变量,从已经定义的ports变量列表中取值
server{
        listen {{ P.port }}  #P.port取键值对中对应的数据
        servername {{ P.name }}
}
{% endfor %}               #以for开头,对应以endfor结尾
最终执行结果:
server{
        listen 8080
        servername web1.shykoo.com
}
server{
        listen 8081
        servername web2.shykoo.com
}
server{
        listen 8082
        servername web3.shykoo.com
}

############################################################
#if的使用
- host: websrvs
  remote_user: root
  vars:
    ports:         #ports为变量名称,其中包含了一个量变列表
      - web1:
        port: 8080
        #name: web1.shykoo.com    #此处被注释
      - web2:
        port: 8081
        name: web2.shykoo.com
  tasks:
    - name: copy conf
      tmplate: src=for3.conf.j2 dest=/data/for3.conf
#===============================
#for2.conf.j2配置文件
{% for P in ports %}              #P为变量,从已经定义的ports变量列表中取值
server{                            
        listen {{ P.port }}       #P.port取键值对中对应的数据,固定存在
 {% if P.name is defined %}       #P.name如果被定义,那么servername将同时被定义
        servername {{ P.name }}   #如果if成立P.name从配置文件中取值 
  {% endif %}                     # if开头,endif结尾
}
{% endfor %}               #以for开头,对应以endfor结尾
最终执行结果:
server{
        listen 8080           #这边因为P.name被注释没有被定义,所以只有端口,没有P.name
}
server{
        listen 8081
        servername web2.shykoo.com
}
原文地址:https://www.cnblogs.com/shykoo/p/10558827.html