使用Ansible循环变量

时间:2018-08-08 10:46:42

标签: loops ansible openstack

我正在尝试创建一个Ansible角色,该角色目前仅包含安全组及其相关规则的部署。我有许多规则应该添加,并且我想保持简单:

在/home/dante/roles/new/tasks/main.yml中,我想创建安全组和一个仅通过所有端口及其应添加的相关协议的循环。例如,我需要这样的东西:

--- #Create the security group
- name: Create the security group
  os_security_group: 
     state: present
     name: sg_default
- name: Add the rules to the security group
    os_security_group_rule:
       security_group: sg_default
       protocol: {{protocol}} 
       port_range_min: {{port}}
       port_range_max: {{port}}
       remote_ip_prefix: 0.0.0.0/0

所有这些都应用于同一安全组。在/ home / dante / roles / new / variable文件夹中,我应该定义所有这些端口及其关联的协议。像这样:

协议,端口:5000,TCP; 389,udp;等等

如果还有其他方法可以实现良好的分隔,我也可以接受。我该如何通过循环遍历所有端口及其相关端口来完成此任务?

编辑

领先一步:

- name: Add the rules to the security group
  os_security_group_rule:
       security_group: sg_default
       protocol: "{{item.protocol}}"
       port_range_min: "{{item.port}}"
       port_range_max: "{{item.port}}"
       remote_ip_prefix: 0.0.0.0/0
  loop:
      - { protocol: 'tcp', port: '22' }
      - { protocol: 'tcp', port: '8774' }

但是我需要在循环内部有一个文件,所有这些变量都应从该文件中获取。在Ansible文档中,没有这样的示例。任何想法应该怎么做?

非常感谢, 罗曼(Romain)

1 个答案:

答案 0 :(得分:0)

这是答案:

在/home/dante/roles/new/tasks/main.yml中:

- name: Add the rules to the security group
  os_security_group_rule:
       security_group: sg_default
       protocol: "{{ item.protocol }}"
       port_range_min: "{{ item.port }}"
       port_range_max: "{{ item.port }}"
       remote_ip_prefix: 0.0.0.0/0
  with_items:
  - "{{ socket }}"

在/home/dante/roles/new/variables/main.yml中:

--- #
socket: 
- { protocol: tcp, port: 22 }
- { protocol: udp, port: 161 }