【问题标题】:Ansible: filter a merged yaml fileAnsible:过滤合并的 yaml 文件
【发布时间】:2019-03-21 00:54:30
【问题描述】:

我目前的设置如下:

ansible.cfg

[defaults]
retry_files_enabled = false
hash_behaviour = merge

主机

[sample]
sampleserver

group_vars

group_vars/1.yml 的内容:

tenants:
  1:
    name: name1
    ip: ip1

group_vars/2.yml 的内容:

tenants:
  2:
    name: name2
    ip: ip2

group_vars/3.yml 的内容:

tenants:
  3:
    name: name3
    ip: ip3

playbook.yml

- hosts: sample

  tasks:
    - set_fact:
        mytenants: "{{ {customtenants: tenants[customtenants]} }}"
      when: customtenants is defined

    - name: Output tenantname
      debug:
        msg: "mytenant: {{ mytenant }} name: {{ mytenant.name }}"
      with_dict: "{{ mytenants|default(tenants) }}"
      loop_control:
        loop_var: mytenant

命令

为所有租户运行(工作正常)

ansible-playbook playbook.yml -i inventory/hosts

只为一个定义的租户运行(工作正常)

ansible-playbook tenants.yml -i inventory/hosts -e "customtenants=1"

为多个定义的租户运行

ansible-playbook playbook.yml -i inventory/hosts -e '{"customtenants": ["1", "3"]}'

谁能帮助我,让它适用于多个租户(最后一个命令示例)?

或者有没有更好的方法来实现这种动态解决方案?

【问题讨论】:

    标签: loops dictionary ansible yaml


    【解决方案1】:

    我过去所做的就是将该变量放在 hosts 行中,例如:

    - hosts: "{{ customtenants | default( 'all' ) }}"
    

    然后您可以删除whenwith_dict 行。

    【讨论】:

    • 这似乎对我不起作用。当我定义这个时,每个主机只执行一次任务。即使我只指定一个自定义租户,变量文件也是整个合并的文件。可以举个例子吗?
    • 你最好给我一个你想要的输出的例子。
    • ansible-playbook playbook.yml -i inventory/hosts "name: name1" "name: name2" "name: name3" ansible-playbook tenants.yml -i inventory/hosts -e "customtenants= 1" "name: name1" ansible-playbook playbook.yml -i inventory/hosts -e '{"customtenants": ["1", "3"]}' "name: name1" "name: name3"
    • 不幸的是,cmets 不保留换行符。可以将所有这些都放入您的问题的编辑中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2015-05-11
    • 2023-04-05
    • 2017-11-27
    • 2023-02-01
    相关资源
    最近更新 更多