Ansible通过循环检查强制性参数

时间:2020-04-17 17:30:21

标签: ansible

我正在创建一个角色,作为第一个任务,我想验证所有相关的强制性参数是否已定义并且不为空。

必需参数的数量是动态的,并根据配置进行更改。 例如如果flag为true,则将需要其他必需参数。

为了解决动态参数,我创建了mandatory_parameters.j2模板文件,其中包含所有相关参数

required_vars:
  - release_pipeline_bb_url
  - release_mail_to
  - dummy
{% if release_pipeline_credential_enabled %}
  - release_pipeline_credential.private_key
{% endif %}
{% if release_descriptor_credential_enabled %}
  - release_descriptor_credential.UserName
  - release_descriptor_credential.Password
{% endif %}

之后,我将此文件加载为vars

- name: Create mandatory validation file
  template:
      dest: "{{ jenkins_casc_folder }}/{{ role_name }}/mandatory.yaml"
      src: mandatory_parameters.j2

- name: Load mandatory parameter file as variable
  include_vars:
      file: "{{ jenkins_casc_folder }}/{{ role_name }}/mandatory.yaml"

我成功地检查了强制性参数是否已定义并且对于“常规”变量而言是否为空,但不适用于字典,例如release_descriptor_credential.Password

- name: Validate all mandatory parameters
  fail: msg="The variable '{{ item }}' is not defined or empty"
  when: ( vars[item] is not defined) or ( vars[item] |length == 0)
  loop: "{{ required_vars }}"

我如何也可以验证字典类型?

我也通过查找尝试过,但是没有成功。

1 个答案:

答案 0 :(得分:1)

下面的任务完成了任务

  - name: Validate all mandatory parameters
    fail:
      msg: "The variable '{{ item }}' is not defined or empty"
    loop: "{{ required_vars }}"
    when: myvar|length == 0
    vars:
      mydict: "{{ item.split('.').0 }}"
      myattr: "{{ item.split('.').1|default('') }}"
      myvar: "{{ (myattr|length > 0)|
                  ternary( lookup('vars', mydict, default='')[myattr]|default(''),
                           lookup('vars', mydict, default='')) }}"
相关问题