Python Ansible:在json对象上设置_事实

Python Ansible:在json对象上设置_事实,python,json,ansible,ansible-2.x,Python,Json,Ansible,Ansible 2.x,我在一个Ansible变量(my_var)中有一个json对象,该变量包含以下类似值: { "Enabled": "true" "SomeOtherVariable": "value" } set_fact: my_var.Enabled: false 我想修改my_var中Enabled的值,并尝试了以下操作: { "Enabled": "true" "SomeOtherVariable": "value" } set_fact: my_var.E

我在一个Ansible变量(
my_var
)中有一个json对象,该变量包含以下类似值:

{
    "Enabled": "true"
    "SomeOtherVariable": "value"
}
set_fact:
  my_var.Enabled: false
我想修改
my_var
Enabled
的值,并尝试了以下操作:

{
    "Enabled": "true"
    "SomeOtherVariable": "value"
}
set_fact:
  my_var.Enabled: false

这两种方法产生的错误类似于:

“变量名'my_var.Enabled'无效。变量必须启动 使用字母或下划线字符,并且仅包含字母, 数字和下划线。”


这可以通过set_fact来完成吗?或者有其他方法来实现吗?

您可以使用Jinja2模板创建一个新词典:

---
- hosts: localhost
  gather_facts: no
  connection: local
  vars:
    my_var:
      Enabled: true
      SomeOtherVariable: value
  tasks:
    - debug:
        var: my_var
    - set_fact:
        my_var: '{ "Enabled": false, "SomeOtherVariable": "{{ my_var.SomeOtherVariable }}" }'
    - debug:
        var: my_var
结果是:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "my_var": {
        "Enabled": true,
        "SomeOtherVariable": "value"
    }
}

TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "my_var": {
        "Enabled": false,
        "SomeOtherVariable": "value"
    }
}

这是我的解决方案——可能不是最有说服力的:

- set_fact:
    my_temp_enabled_var: '{ "Enabled": "false" }'

- set_fact:
    my_temp_enabled_var: "{{ my_temp_enabled_var | from_json }}"

- set_fact:
    my_var: "{{ my_var | combine(my_temp_enabled_var) }}"

如果变量中有一个数据结构,那么创建它的方式又有什么关系呢?它是JSON中的一个字典,也是Ansible中的一个字典。你能解释一下你的意思吗?谢谢你。我最终还是采用了我发布的解决方案。如果json没有传入,并且可以按照您的示例在playbook中创建,那么您的解决方案将是理想的。如果对象作为大型序列化json对象传入,那么您的方法根本不可行。需要重建任务中的整个对象才能设置一个属性。我给出的json示例是对实际对象的简化,只是它是实现这一点的方法,特别是使用您所称的“大型序列化json对象”。因为,如果它包含嵌套字典,那么您的
combine
方法将替换整个分支,而不仅仅是叶。这是一个很好的观点。幸运的是,在这种情况下,叶子在最上面的树枝上。有点担心的是,如果它是几层以下的嵌套对象,那么您的方法是唯一的方法。。不能在每个子级别创建每个分支的克隆并迭代组合以产生相同的结果吗?这可以缩短为单个任务
my_var:'{{my_var | combine({“Enabled”:false}}}}'
。您不需要使用来自_json的