首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于set_facts将多个不确定条件合并为一个

如何基于set_facts将多个不确定条件合并为一个
EN

Stack Overflow用户
提问于 2020-09-28 17:34:57
回答 1查看 1.1K关注 0票数 2

在通过Ansible的SO post之一时,对使用不同条件检查的set_fact感兴趣。

然而,我根据我的方法在帖子中回答,但是,我仍然认为,对于类似的任务,比如确定location resource groupvnet,俱乐部的多个条件可以有所改进。

下面是playbook和变量文件azure_vars.yml

剧本:

代码语言:javascript
复制
---
- 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

代码语言:javascript
复制
---
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

预期将是俱乐部三人以下的一个条件:

代码语言:javascript
复制
- 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]'

可能是这样的:

代码语言:javascript
复制
- 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]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-28 19:35:39

您可以使用loopzip过滤器来解决这个问题,或者以更老的方式解决这个问题,如果您想要将来的话,可以使用with_together (不再推荐)来验证您的游戏手册。

考虑到剧本:

代码语言:javascript
复制
- 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

代码语言:javascript
复制
azure_domains:
  - us-sea01
  - us-azrc2
  - eu-azrc1

azure_location:
  - westus2
  - southcentralus
  - westeurope

这就产生了重述:

代码语言:javascript
复制
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的元素。

考虑到剧本:

代码语言:javascript
复制
- 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:

代码语言:javascript
复制
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   

它不使用循环,因此可以更容易地重述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64106956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档