如何在ansible中将字典格式化为字符串

DDS*_*low 3 jinja2 ansible

我想像这样在ansible中格式化一个字典,

{'a': 1, 'b': 2, 'c': 3}
Run Code Online (Sandbox Code Playgroud)

'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)

并且必须将其设置为块中的环境变量,如下所示,

vars:
  test_env:
    a: 1
    b: 2
    c: 3

- block:
    # tasks
  environment:
    SOME_ENV: 'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)

这里我想将test_envdict 转换为'a=1,b=2,c=3' 我无法设置事实来修改 dict 然后将其设置为SOME_ENV因为environment是一个不同的子句,也许我可以修改子句中的 dictvars但还有其他解决方案吗?

Vla*_*tka 8

将字典分解为键和值的列表。然后压缩列表并加入项目。例如,

    - block:
        - command: echo $SOME_ENV
          register: result
        - debug:
            var: result.stdout
      environment:
        SOME_ENV: "{{ test_env.keys()|
                      zip(test_env.values())|
                      map('join', '=')|
                      join(',') }}"
Run Code Online (Sandbox Code Playgroud)

  result.stdout: a=1,b=2,c=3
Run Code Online (Sandbox Code Playgroud)

更新

还有更多选择。您还可以使用JinjaJMESPath。下面的表达式给出相同的结果

  SOME_ENV: |-
    {%- for k,v in test_env.items() %}
    {{ k }}={{ v }}{% if not loop.last %},{% endif %}
    {%- endfor %}
Run Code Online (Sandbox Code Playgroud)
  SOME_ENV: "{{ test_env|dict2items|
                json_query('[].join(`=`, [key, to_string(value)])')|
                join(',') }}"
Run Code Online (Sandbox Code Playgroud)

用于测试的完整剧本示例

- hosts: all

  vars:

    test_env:
      a: 1
      b: 2
      c: 3

  tasks:

    - block:

        - command: "echo ${{ item }}"
          register: result
          loop: [SOME_ENV, SOME_EN2, SOME_EN3]

        - debug:
            msg: "{{ result.results|
                     items2dict(key_name='item', value_name='stdout') }}"

      environment:

        SOME_ENV: "{{ test_env.keys()|
                      zip(test_env.values())|
                      map('join', '=')|
                      join(',') }}"

        SOME_EN2: |-
          {%- for k,v in test_env.items() %}
          {{ k }}={{ v }}{% if not loop.last %},{% endif %}
          {%- endfor %}

        SOME_EN3: "{{ test_env|dict2items|
                      json_query('[].join(`=`, [key, to_string(value)])')|
                      join(',') }}"
Run Code Online (Sandbox Code Playgroud)

给出(删节)

  msg:
    SOME_EN2: a=1,b=2,c=3
    SOME_EN3: a=1,b=2,c=3
    SOME_ENV: a=1,b=2,c=3
Run Code Online (Sandbox Code Playgroud)