在通过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_vars.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]发布于 2020-09-28 19:35:39
您可以使用loop和zip过滤器来解决这个问题,或者以更老的方式解决这个问题,如果您想要将来的话,可以使用with_together (不再推荐)来验证您的游戏手册。
考虑到剧本:
- hosts: all
vars:
azure_vm_name: foo.bar.us-sea01.whatever.example.org
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
domain: "{{ host.2 }}"
- name: Domain
debug:
msg: "{{ domain }}"
- set_fact:
location: "{{ item.1 }}"
loop: "{{ azure_domains | zip(azure_location) | list }}"
when: 'domain == item.0'
- name: Location
debug:
msg: "{{ location }}"和变量文件azure_vars.yml
azure_domains:
- us-sea01
- us-azrc2
- eu-azrc1
azure_location:
- westus2
- southcentralus
- westeurope这就产生了重述:
PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [localhost]
TASK [include_vars] **********************************************************************************************
ok: [localhost]
TASK [set_fact] **************************************************************************************************
ok: [localhost]
TASK [set_fact] **************************************************************************************************
ok: [localhost]
TASK [Domain] ****************************************************************************************************
ok: [localhost] => {
"msg": "us-sea01"
}
TASK [set_fact] **************************************************************************************************
ok: [localhost] => (item=['us-sea01', 'westus2'])
skipping: [localhost] => (item=['us-azrc2', 'southcentralus'])
skipping: [localhost] => (item=['eu-azrc1', 'westeurope'])
TASK [Location] **************************************************************************************************
ok: [localhost] => {
"msg": "westus2"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=7 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 这意味着还有另一种可能性,使用Python的Ansible功能。您可以使用列表的index()方法将azure_location的元素定位在与azure_domains中的domain位于相同位置的位置。
例如,如果domain位于2 of azure_domains,则在azure_location中将得到2的元素。
考虑到剧本:
- hosts: all
vars:
azure_vm_name: foo.bar.us-sea01.whatever.example.org
tasks:
- include_vars: azure_vars.yml
- set_fact:
host: "{{ azure_vm_name.split('.') }}"
- set_fact:
domain: "{{ host.2 }}"
- name: Domain
debug:
msg: "{{ domain }}"
- set_fact:
location: "{{ azure_location[azure_domains.index(domain)] }}"
- name: Location
debug:
msg: "{{ location }}"以及相同的变量文件azure_vars.yml,这将产生recap:
PLAY [all] ******************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************
ok: [localhost]
TASK [include_vars] *********************************************************************************************************
ok: [localhost]
TASK [set_fact] *************************************************************************************************************
ok: [localhost]
TASK [set_fact] *************************************************************************************************************
ok: [localhost]
TASK [Domain] ***************************************************************************************************************
ok: [localhost] => {
"msg": "us-sea01"
}
TASK [set_fact] *************************************************************************************************************
ok: [localhost]
TASK [Location] *************************************************************************************************************
ok: [localhost] => {
"msg": "westus2"
}
PLAY RECAP ******************************************************************************************************************
localhost : ok=7 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 它不使用循环,因此可以更容易地重述。
https://stackoverflow.com/questions/64106956
复制相似问题