You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:08:13