如何获取小写的 ansible 事实

she*_*rri 6 python jquery jinja2 ansible ansible-facts

我正在收集可靠的事实。序列号有大写和小写两种形式。见下文。

5A2c32a-f1G85g-2035-0483-1fe9c129216d 
Run Code Online (Sandbox Code Playgroud)

我需要将该事实与另一个完全小写的序列号进行比较。请参见下文。

5a2c32a-f1g85g-2035-0483-1fe9c129216d 
Run Code Online (Sandbox Code Playgroud)

如果我使用 jinja2 过滤器转换为小写。然后我无法操作 json 输出。例如。我试过这个

- set_fact:
     facts: "{{ facts | lower | to_json }}"

- debug:
    var: facts.instance
Run Code Online (Sandbox Code Playgroud)

它抛出错误

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

TASK [play : debug] ******************************************************************************
ok: [localhost] => {
    "facts.instance": "VARIABLE IS NOT DEFINED!"
}
Run Code Online (Sandbox Code Playgroud)

但如果我facts只调试。它给了我输出。下面的作品,

- set_fact:
     facts: "{{ facts | lower | to_json }}"

- debug:
    var: facts
Run Code Online (Sandbox Code Playgroud)

但我需要获得更多的价值facts.instance.disk

Zei*_*tor 0

为了方便和更容易维护,我可能会用几行 python 来解决这个问题。下面的示例是与 playbook 相邻的自定义过滤器插件,但您可以将其作为集合的一部分分发

\n

在下面的示例中,我将传递一个键列表,这些键可以出现在原始字典中的任何位置,并且需要小写。这使您可以控制小写的确切数据,并且如果需要,您可以传递多个键。

\n

这是示例文件结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 filter_plugins\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_facts_filters.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 playbook.yml\n
Run Code Online (Sandbox Code Playgroud)\n

这是filter_plugins/my_facts_filters.py自定义过滤器(改编自其他答案):

\n
from ansible.errors import AnsibleError\n\n\ndef inspect_and_replace(data, elements_list):\n    if isinstance(data, (dict, list)):\n        for k, v in (data.items() if isinstance(data, dict) else enumerate(data)):\n            if k in elements_list and isinstance(v, str):\n                data[k] = v.lower()\n            inspect_and_replace(v, elements_list)\n\n\ndef elements_to_lower(input_dict, elements_list):\n    # Raise an ansible error in input is not a dict\n    try:\n        assert isinstance(input_dict, dict)\n    except AssertionError:\n        raise AnsibleError(f\'Input is not a dict. Got {type(input_dict)}\')\n\n    try:\n        assert isinstance(elements_list, list)\n    except AssertionError:\n        raise AnsibleError(f\'filter argument (i.e. elements to downcase) is not a list. Got {type(elements_list)}\')\n\n    inspect_and_replace(input_dict, elements_list)\n    return input_dict\n\n\nclass FilterModule(object):\n    """my facts filters."""\n\n    def filters(self):\n        """Return the filter list."""\n        return {\n            \'elements_to_lower\': elements_to_lower\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

一个最小的测试手册:

\n
---\n- hosts: localhost\n  gather_facts: false\n\n  tasks:\n    - name: Dummy task to set the same var (I believe...) as in your example\n      ansible.builtin.set_fact:\n        facts:\n          instance:\n            config:\n              hardware:\n                device:\n                  - backing:\n                      uuid: 5A2c32a-f1G85g-2035-0483-1fe9c129216d\n                    unitNumber: 0\n\n    - name: Use custom filter to transform needed elements\n      ansible.builtin.debug:\n        msg: "{{ facts | elements_to_lower([\'uuid\']) }}"\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:

\n
$ ansible-playbook playbook.yml \n\nPLAY [localhost] **************************************************************************************************************************************************************************************************************\n\nTASK [Dummy task to set the same var (I believe...) as in your example] *******************************************************************************************************************************************************\nok: [localhost]\n\nTASK [Use custom filter to transform needed elements] *************************************************************************************************************************************************************************\nok: [localhost] => {\n    "msg": {\n        "instance": {\n            "config": {\n                "hardware": {\n                    "device": [\n                        {\n                            "backing": {\n                                "uuid": "5a2c32a-f1g85g-2035-0483-1fe9c129216d"\n                            },\n                            "unitNumber": 0\n                        }\n                    ]\n                }\n            }\n        }\n    }\n}\n\nPLAY RECAP ********************************************************************************************************************************************************************************************************************\nlocalhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n
Run Code Online (Sandbox Code Playgroud)\n