如何在Ansible 2.9.27中将AnsibleUnsafeText字符串转为字典
在Ansible 2.9.27中转换AnsibleUnsafeText为指定格式字典的解决方案
针对你描述的场景,我们可以通过多步文本处理+正则替换的方式,将原始字符串转换为符合要求的字典格式,以下是具体实现步骤:
步骤1:清理字符串中的多余空格
首先去除逗号、冒号前后的所有空格/制表符,避免后续拆分出错:
- set_fact: cleaned_var: "{{ my_var | regex_replace('\\s*([:,])\\s*', '\\1') }}"
该正则会匹配:或,前后的任意空白字符,替换为无空格的符号,例如将var4 : , var5: foo_1转换为var4:,var5:foo_1。
步骤2:拆分键值对列表
将清理后的字符串按逗号拆分为独立的键值对列表:
- set_fact: kv_pairs: "{{ cleaned_var | split(',') }}"
执行后会得到类似['var1:placeholder_var1', 'var4:', 'var7:[a,b,c]']的列表。
步骤3:格式化单个键值对
先将所有键值对转换为'key': 'value'的格式,空值会自动处理为'key': '':
- set_fact: formatted_kvs: "{{ kv_pairs | map('regex_replace', '^(\\w+):(.*)$', \"'\\1': '\\2'\") | list }}"
此时列表中的元素会变成'var1': 'placeholder_var1'、'var4': ''、'var7': '[a,b,c]'。
步骤4:处理列表类型的值
针对列表格式的值,将内部元素添加单引号并转换为正确的列表语法:
- set_fact: formatted_kvs: "{{ formatted_kvs | map('regex_replace', \"'(\\w+)': '\\[(.*)\\]'\", \"'\\1': ['\\2' | regex_replace('([a-zA-Z0-9_]+)', \"'\\1'\") | replace(',', \"','\")]\") | list }}"
这一步会把'var7': '[a,b,c]'转换为'var7': ['a','b','c']。
步骤5:组装最终字典字符串
将所有格式化后的键值对用, 连接,包裹上大括号得到最终结果:
- set_fact: my_dict_str: "{{ '{' ~ formatted_kvs | join(', ') ~ '}' }}"
完整Playbook示例
--- - name: Convert AnsibleUnsafeText to formatted dict string hosts: localhost vars: my_var: "var1:placeholder_var1,var2:placeholder_var2,var3:placeholder_var3,var4:,var5:foo_1,var6:foo_2,var7:[a,b,c],var8:foo3" tasks: - set_fact: cleaned_var: "{{ my_var | regex_replace('\\s*([:,])\\s*', '\\1') }}" - set_fact: kv_pairs: "{{ cleaned_var | split(',') }}" - set_fact: formatted_kvs: "{{ kv_pairs | map('regex_replace', '^(\\w+):(.*)$', \"'\\1': '\\2'\") | list }}" - set_fact: formatted_kvs: "{{ formatted_kvs | map('regex_replace', \"'(\\w+)': '\\[(.*)\\]'\", \"'\\1': ['\\2' | regex_replace('([a-zA-Z0-9_]+)', \"'\\1'\") | replace(',', \"','\")]\") | list }}" - set_fact: my_dict_str: "{{ '{' ~ formatted_kvs | join(', ') ~ '}' }}" - debug: var: my_dict_str
执行后,my_dict_str的值会完全符合你要求的格式:
{'var1': 'placeholder_var1', 'var2': 'placeholder_var2', 'var3': 'placeholder_var3', 'var4': '', 'var5': 'foo_1', 'var6': 'foo_2', 'var7': ['a','b','c'], 'var8': 'foo3'}
内容的提问来源于stack exchange,提问作者ferdinand
相关产品推荐
相关产品推荐

