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等
为了方便和更容易维护,我可能会用几行 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\nRun Code Online (Sandbox Code Playgroud)\n这是filter_plugins/my_facts_filters.py自定义过滤器(改编自其他答案):
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 }\nRun 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\']) }}"\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
14890 次 |
| 最近记录: |