在浏览Ansible的其中一个SO post时,我对set_fact
在不同条件检查中的用法感兴趣。
然而,我根据我的方法在帖子上回答了问题,但是,我仍然看到,对于类似的任务,如确定location
resource group
和vnet
,俱乐部的多个条件可以有所改进。
下面是playbook
和变量文件azure_vars.yml
行动手册:
---
- name: create azure vm
hosts: localhost
connection: local
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
domain: "{{ host.1 }}.{{ host.2 }}"
- name: Domain
debug:
msg: "{{ domain }}"
- set_fact:
location: "{{ azure_location[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
location: "{{ azure_location[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
location: "{{ azure_location[2] }}"
when: 'domain == azure_domain[2]'
- name: Location
debug:
msg: "{{ location }}"
- set_fact:
res_group: "{{ azure_res_group[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
res_group: "{{ azure_res_group[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
res_group: "{{ azure_res_group[2] }}"
when: 'domain == azure_domain[2]'
- name: Resource Group
debug:
msg: "{{ res_group }}"
- set_fact:
vnet: "{{ azure_nprod_vnet }}"
when: 'domain == azure_domain[0]'
- set_fact:
vnet: "{{ azure_prod03_vnet }}"
when: 'domain == azure_domain[2]'
- set_fact:
vnet: "{{ azure_prod02_vnet }}"
when: 'domain == azure_domain[1]'
- name: Vnet
debug:
msg: "{{ vnet }}"
变量文件:此文件包含所有变量,这些变量将成为playbook
的一部分,并作为任务部分下的include_vars
导入。
- Azure _变量.yml*
---
azure_nprod_vnet: "/subscriptions/XXXXXXXX-XXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg001/providers/Microsoft.Network/virtualNetworks/vnet"
azure_prod02_vnet: "/subscriptions/XXXXXXXX-XXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet"
azure_prod03_vnet: "/subscriptions/XXXXXXXX-XXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg002/providers/Microsoft.Network/virtualNetworks/vnet"
# Azure domain
azure_domains:
- us-sea01
- us-azrc2
- eu-azrc1
# Resource group
azure_res_group:
- rg001
- rg002
- rg003
# Azure locations
azure_location:
- westus2
- southcentralus
- westeurope
预计会是俱乐部下面三个变成一个的条件:
- set_fact:
location: "{{ azure_location[0] }}"
when: 'domain == azure_domain[0]'
- set_fact:
location: "{{ azure_location[1] }}"
when: 'domain == azure_domain[1]'
- set_fact:
location: "{{ azure_location[2] }}"
when: 'domain == azure_domain[2]'
可能是这样的:
- set_fact:
location:
- azure_location[0]
- azure_location[1]
- azure_location[2]
when:
- 'domain == azure_domain[0]
- 'domain == azure_domain[1]
- 'domain == azure_domain[2]
1条答案
按热度按时间btqmn9zl1#
您可以使用
loop
和zip
过滤器来解决此问题,或者使用with_together
(如果您想让您的行动手册适应未来的发展,则不再推荐使用这种老式方法)。根据行动手册:
以及变量文件 azure_vars.yml:
这就产生了总结:
也就是说,还有另一种可能性,利用Python的Ansible功能,你可以使用列表的
index()
方法来定位azure_location
中的元素,该元素与azure_domains
中的domain
位置相同。例如,如果
domain
位于azure_domains
的位置2
,则会得到azure_location
中位置2
的元素。根据行动手册:
和相同的变量文件 azure_vars.yml,这将生成以下摘要:
它没有使用循环,所以更容易重述。