是否可以用Jinja2模板化Ansible的uri模块的参数?

问题描述 投票:0回答:1

我只是想知道是否可以在 URI 模块中使用 jinja2 模板。

我尝试过这样的事情:

- name: update checkpoint members asset field
  uri: |
      [{% for item in device_result_set if item.Name in checkpointPairs %}
      {{  url: api_host""api_target""item.ID
          method: PUT
          validate_certs: 'no'
          status_code: 200
          headers:
            Content-Type: 'application/json'
            Authorization: 'Custom' api_key
          body_format: 'json'
          body: item}},
      {% endfor %}]
  register: put_result
  no_log: False
  tags: put

我尝试使用 Jinja2 模板的原因是为了优化循环过程,这需要大量时间 - 我预计有两千个项目,任务在 50 - 60 个项目后会变慢。

或者也许考虑一下我不知道的不同机制。

for-loop ansible jinja2 ansible-awx
1个回答
0
投票

从字典中模板化参数是可能的,但强烈建议不要这样做,因为在处理受损数据时可能会面临安全问题:

您可以从字典类型变量设置任务的所有参数。该技术在某些动态执行场景中非常有用。然而,它带来了安全风险。我们不推荐这样做,因此当您执行此类操作时,Ansible 会发出警告

#...
vars:
  usermod_args:
    name: testuser
    state: present
    update_password: always
tasks:
- user: '{{ usermod_args }}'

来源:https://docs.ansible.com/ansible/devel/reference_appendices/faq.html#when-is-it-unsafe-to-bulk-set-task-arguments-from-a-variable< /sup>

这就是说,我认为不需要实际模板化参数,在这种特定情况下,您可以使用使用

selectattr
:

过滤的普通循环
- name: update checkpoint members asset field
  uri: 
    url: "{{ api_host }}{{ api_target }}{{ item.ID }}"
    method: PUT
    validate_certs: 'no'
    status_code: 200
    headers:
      Content-Type: application/json
      Authorization: "Custom {{ api_key }}"
    body_format: json
    body: "{{ item }}"
  register: put_result
  loop: "{{ device_result_set | selectattr('Name', 'in', checkpointPairs) }}"
  no_log: False
  tags: put
  
© www.soinside.com 2019 - 2024. All rights reserved.