【问题标题】:Ansible variable isn't substituted for dictionary key, but it is for the dictionary valueAnsible 变量不能代替字典键,但它是字典值
【发布时间】:2021-09-12 00:38:53
【问题描述】:

我正在尝试使用我创建的字典进行键和值更新,但 每个都有变量。我提示用户他们想要更新哪个键,以及什么值并使用 set_fact 存储它们。

这是我的应用程序字典

applications:
  office:
    nuspec:
      id: black
      version: blue
    chocolatey_install:
      softwareName: yellow

当我对“id​​”进行硬编码并尝试使用变量更新其值时,一切都很好。见下文:

- name: Setting new_chocolatey_parameter_value
  set_fact: new_chocolatey_parameter_value="rainbow"

- name: Change applications.office.nuspec.id to prompted value
  set_fact:
    applications: "{{ applications|combine({'office': {'nuspec': {'id': '{{ new_chocolatey_parameter_value }}'}}}, recursive=True) }}"

我得到输出 Id hope

ok: [localhost]

TASK [output applications] *****************************************************
ok: [localhost] => {
    "applications": {
        "office": {
            "chocolatey_install": {
                "softwareName": "yellow", 
            }, 
            "nuspec": {
                "id": "rainbow", 
                "version": "blue"
            }
        }
    }
}

但我想使用一个变量来更新“id”的位置,以便更新应用程序字典。见下文

- name: Setting new_chocolatey_parameter_value
  set_fact: new_chocolatey_parameter_value="rainbow"

- name: Setting selected_current_chocolatey_parameter
  set_fact: selected_current_chocolatey_parameter="id"        

- name: Change applications.office.nuspec.id to prompted value
  set_fact:
    applications: "{{ applications|combine({'office': {'nuspec': {'{{ selected_current_chocolatey_parameter }}': '{{ new_chocolatey_parameter_value }}'}}}, recursive=True) }}"

但正如你在下面看到的,它在字典中放置了一个新条目,其键为

“{{ selected_current_chocolatey_parameter }}”

ok: [localhost] => {
    "applications": {
        "office": {
            "chocolatey_install": {
                "softwareName": "yellow", 
            }, 
            "nuspec": {
                "id": "black", 
                "version": "blue", 
                "{{ selected_current_chocolatey_parameter }}": "rainbow"
            }
        }
    }
}

我如何简单地获取 {{ selected_current_chocolatey_parameter }} 的值,即“id”,以替换我的应用程序字典更新代码?当 'id' 被硬编码时,我试图获得与输出相同的结果,而是使用变量的值来完成此操作。

我尝试了许多单引号/双引号的排列,并尝试了转义字符,但均无济于事。

有什么帮助吗?

【问题讨论】:

    标签: python dictionary ansible jinja2


    【解决方案1】:

    你试过了吗?

    "{{ applications|combine({'office': {'nuspec': {'%s': '%s'}}}, recursive=True) }}" % (selected_current_chocolatey_parameter, new_chocolatey_parameter_value)
    

    【讨论】:

    • 已经在 jinja2 上下文中时不需要使用字符串插值; python dicts 允许变量作为键:"{{ applications|combine({'office': {'nuspec': {selected_current_chocolatey_parameter: new_chocolatey_parameter_value}}}, recursive=True) }}"——几乎这个确切的问题是already asked;我猜他们一波又一波
    • 你是我的英雄!感谢您的帮助!我是这方面的业余爱好者,有什么可以推荐的读物让我开始理解 jinja2 语法吗?
    猜你喜欢
    • 2020-02-29
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多