如何在Ansible中更新嵌套变量

Mik*_*ski 6 python ansible

我有一些额外的信息,比如存储在/etc/ansible/facts.d/environment.fact中的数据库连接细节等.

这些可用作变量ansible_local.environment.database.name.更新数据库名称的最佳方法是什么?

我尝试了set_fact模块但无法正确更新嵌套变量.它只是覆盖整个ansible_local哈希.

- name: Update database name
  set_fact:
  args:
    ansible_local:
      environment:
        database:
          name: "{{ db_name }}"
Run Code Online (Sandbox Code Playgroud)

wst*_*wst 5

假设您使用的是Ansible 2.0或更早版本,这应该会有所帮助。

- set_fact:
    test:
      app:
        in: 1
        out: 2

- set_fact:
    test_new:
      app:
        transform: 3

- set_fact:
    test: "{{test|combine(test_new,recursive=True)}}"

- debug: var=test
Run Code Online (Sandbox Code Playgroud)

一个combine是Jinja2过滤器。确保recursive在这种情况下使用参数。


anl*_*lar 1

这是默认的 Ansible 行为——更改部分哈希值时覆盖整个哈希值。参见ansible.conf:

# if inventory variables overlap, does the higher precedence one win
# or are hash values merged together?  The default is 'replace' but
# this can also be set to 'merge'.
#hash_behaviour = replace
Run Code Online (Sandbox Code Playgroud)

因此,如果您将其更改为它,hash_behaviour = merge它将按您的预期工作。