json Ansble -将文件内容添加到字典中

ergxz8rk  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(82)

我需要将几个包含文件内容的字典添加到一个列表中,以便进一步使用URI模块。我现在手动操作,像这样:

ansible.builtin.uri:
  method: POST
  body_format: json
  body:
    actions:
      - action: create
          file_path: ".gitlab-ci.yml"
          content: "{{ lookup('file', '.gitlab-ci.yml') }}"
      - action: create
          file_path: "README.md"
          content: "{{ lookup('file', 'README.md') }}"

字符串
我想让这个任务通用,这样我就不必硬指定文件的名称:

ansible.builtin.set_fact:
  files:
   - .gitlab-ci.yml
   - README.md

ansible.builtin.uri:
  method: POST
  body_format: json
  body:
    actions: ["
      {% for fs in files -%}
      {
        'action': 'create',
        'file_path': '{{ fs }}',
        'content': '{{ lookup('file', fs) }}'
      }{% if not loop.last %},{% endif %}
      {%- endfor %}"
      ]


因此,文件的内容存储在actions[*]内容变量中,但仅作为字符串存储,因为文件包含标记。如果将lookup替换为'Hello World'行,则会正常生成json。你能告诉我如何使用looplookup保存一个文件的内容与actions变量中的content键吗?

dced5bon

dced5bon1#

使用过滤器 indent 正确缩进块。然后通过 from_yaml 对结构进行 * 过滤 *

actions: |
      {% filter from_yaml %}
      {% for fs in files %}
      - action: create
        file_path: {{ fs }}
        content: |
          {{ lookup('file', fs)|indent(4) }}
      {% endfor %}
      {% endfilter %}

字符串
给予

actions:
  - action: create
    content: |-
      Content of .gitlab-ci.yml
      line 2
      line 3
      # EOF
    file_path: .gitlab-ci.yml
  - action: create
    content: |-
      Content of README.md
      line 2
      line 3
      # EOF
    file_path: README.md


您应该能够在 uri 模块中使用它

- ansible.builtin.uri:
    method: POST
    body_format: json
    body: "{'actions': {{ actions|to_json }} }"


(not测试)

相关问题