【问题标题】:Set_fact dynamic variable name inside loopSet_fact 循环内的动态变量名
【发布时间】:2020-07-28 13:53:45
【问题描述】:

我有一个accounts 列表,一个字典mappedsecrets,其中accounts 作为键,secrets 作为值列表,最后一个字典secrets 包含秘密名称和秘密-价值观

#variables
accounts:
  acc_one
  acc_two

mappedsecrets:
  acc_one:
    - keyone
    - keytwo
  acc_two:
    - keythree
    - keyfour

secrets:
  keyone: secret_1
  keytwo: secret_2
  keythree: secret_3
  keyfour: secret_4

我有一个 include_task 循环帐户,loop_var:account。 在循环内,我想创建一个 dict all key - 帐户已映射的秘密: 比如:

acc_one:
  keyone: secret_1
  keytwo: secret_2

我选择了 set_fact 路线,使用了 combine 过滤器。

- name: "Create dict of account secrets"
  set_fact:
    account_secrets: "{{ account_secrets |default({}) | combine( {item: secrets[item]} ) }}"
  with_items:
    - "{{ mappedsecrets[account] }}"

问题是:

每个循环只是不断附加account_secrets 变量,这导致最后一个帐户拥有之前迭代的所有秘密。

(如果我错了,请纠正我)我已经读到不可能在 ansible-play 中重置事实。 所以我想我可以根据循环迭代制作动态名称:比如account_secrets_{{ ansible_loop.index }}

但我一直无法弄清楚以下内容的正确语法:

set_fact: account_secrets_{{ ansible_loop.index }}: "{{ account_secrets_{{ ansible_loop.index }} |default({}) | combine( {item: secrets[item]} ) }}"

【问题讨论】:

    标签: ansible


    【解决方案1】:

    我想通了:

    set_fact:
        account_secrets_{{ ansible_loop.index }}: "{{ lookup('vars', 'account_secrets_' + ansible_loop.index|string) |default({}) | combine( {item: secrets[item]} ) }}"
    

    我还是很好奇,有没有更“可靠”的方式来实现这个用例?

    【讨论】:

      猜你喜欢
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2019-04-19
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多