ansible - 追加到 Ansible 列表中的字典

标签 ansible jinja2 ansible-2.x

我有以下结构,需要将其合并到单个字典列表中。

我可以更改 secrets 列表的语法/结构(如果更容易的话,可以更改为其他内容)。

vars:
  users:
    - name: foo
      database: foodb
    - name: bar
      database: bardb

  secrets:
    - name: foo
      password: foopass
    - name: bar
      password: barpass

预期结果:

users:
  - name: foo
    database: foodb
    password: foopass
  - name: bar
    database: bardb
    password: barpass

我尝试了几种过滤器都无济于事,我最接近的是:

tasks: 
  - set_fact: foo: "{{ foo|default([]) + [item | combine(secrets, recursive=True)] }}"
    with_items: "{{ users }}"

结果:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "|combine expects dictionaries, got u'foo'"}

最佳答案

例如:

---
- hosts: localhost
  gather_facts: no
  vars:
    users:
      - name: foo
        database: foodb
      - name: bar
        database: bardb
    secrets:
      - name: foo
        password: foopass
      - name: bar
        password: barpass
  tasks:
    - set_fact:
        tmp_user: "{{ item | combine(secrets | selectattr('name','equalto',item.name) | first) }}"
      with_items: "{{ users }}"
      register: tmp_users
    - set_fact:
        users: "{{ tmp_users.results | map(attribute='ansible_facts.tmp_user') | list }}"
    - debug:
        msg: "{{ users }}"

关于ansible - 追加到 Ansible 列表中的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42673166/

相关文章:

ansible - 为什么 Ansible 忽略 ansible_become_password 变量?

ansible - 如何在ansible中为变量分配随机数?

python - Flask:蓝图中的模板继承自应用程序中的模板?

templates - Jinja 注释掉命令会破坏模板

ansible - 参数组的类型为 'dict',我们无法转换为列表

python - 在ansible中,我们如何将所有任务文件包含在一个目录中

templates - Flask 中的 Jinja2 模板无法呈现 CONTINUE 语句

python - 如何使用 ansible 'expect' 模块进行多个不同的响应?

当变量具有默认值时,Ansible playbook 条件失败

Ansible 主机变量未定义