通过循环填充字典列表

Populate a list of dictionary through a loop

我想通过循环生成字典列表。我发现我们可以使用 with_sequence 在 ansible 中生成整数序列。我收到以下错误:

The offending line appears to be:

- { "dir": "{{ mat_cleaner_input_file_path_flow }}/{{ item }}" }
      with_sequence: start=0 end={{ http_range }}
      ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

我的配置.j2:

{{ cleaner_config | to_nice_yaml(indent=2) }}

我的task.yml:

---
- name: Test dictionaries playbook
  hosts: localhost
  connection: local

  vars:
    mat_cleaner_input_file_path_flow: "/var/opt/miq/sftp/edr-flow"
    mat_cleaner_input_file_path_http: "/var/opt/miq/sftp/edr-http"
    mat_cleaner_input_retention_period: 21600
    http_range: 5
    cleaner_config:
      - { "dir": "{{ mat_cleaner_input_file_path_flow }}/{{ item }}" }
      with_sequence: start=0 end={{ http_range }}

  tasks:
    - name: Set Cleaner Config
      template:
        src: /home/osboxes/CleanerConfig/cleaner.config.j2
        dest: /home/osboxes/CleanerConfig/output
      delegate_to: localhost
      with_items: cleaner_config

我希望最终输出文件为:

dir: /var/opt/miq/sftp/edr-flow/0
dir: /var/opt/miq/sftp/edr-flow/1
dir: /var/opt/miq/sftp/edr-flow/2

您要的输出文件格式为文本。这不是一个列表。您可以通过 Jinja 创建它,例如

    mat_cleaner_input_file_path_flow: "/var/opt/miq/sftp/edr-flow"
    http_range: 3
    cleaner_config: |
      {% for i in range(http_range) %}
      {{ mat_cleaner_input_file_path_flow }}/{{ i }}
      {% endfor %}

给予

  cleaner_config: |-
    /var/opt/miq/sftp/edr-flow/0
    /var/opt/miq/sftp/edr-flow/1
    /var/opt/miq/sftp/edr-flow/2

然后,因为它不是列表,所以您不必在模板中使用 to_nice_yaml。如果要缩进行,请改用 indent,例如

shell> cat cleaner.config.j2
  {{ cleaner_config|indent(2) }}
    - template:
        src: cleaner.config.j2
        dest: output

给予

shell> cat output 
  /var/opt/miq/sftp/edr-flow/0
  /var/opt/miq/sftp/edr-flow/1
  /var/opt/miq/sftp/edr-flow/2

一般情况下,你会简化代码,省略cleaner_config变量,将Jinja迭代放到模板中,例如

    mat_cleaner_input_file_path_flow: "/var/opt/miq/sftp/edr-flow"
    http_range: 3
shell> cat cleaner.config.j2
{% for i in range(http_range) %}
  {{ mat_cleaner_input_file_path_flow }}/{{ i }}
{% endfor %}

如果要使用列表

    mat_cleaner_input_file_path_flow: "/var/opt/miq/sftp/edr-flow"
    http_range: 3
    cleaner_config_text: |
      {% for i in range(http_range) %}
      - {{ mat_cleaner_input_file_path_flow }}/{{ i }}
      {% endfor %}
    cleaner_config: "{{ cleaner_config_text|from_yaml }}

给予

  cleaner_config:
  - /var/opt/miq/sftp/edr-flow/0
  - /var/opt/miq/sftp/edr-flow/1
  - /var/opt/miq/sftp/edr-flow/2

现在你需要to_nice_yaml来格式化列表,例如

shell> cat cleaner.config.j2
  {{ cleaner_config|to_nice_yaml|indent(2) }}

给予

shell> cat output 
  - /var/opt/miq/sftp/edr-flow/0
  - /var/opt/miq/sftp/edr-flow/1
  - /var/opt/miq/sftp/edr-flow/2