ansible 我如何向 get_url 模块添加条件以不包含或包含 include_role 中的所有者和组属性

ansible how can i add condition to get_url modul to not include or include the owner and group properties from include_role

我 include_role 我正在使用剧本中的工作文件,我希望能够使用它 不同的剧本,但并非所有剧本都需要执行所有 get_url 属性。 例如:

- name: Download
  include_role:
    name: utilities
    tasks_from: download
  vars:
    dest: "{{ ansible_env.APP }}/"
    url: "{{ url }}"

这个角色:

---
- name: Download_role
  get_url:
    url_username: "{{ packages_user }}"
    url_password: "{{ packages_pass }}"
    dest: "{{ dest }}"
    url: "{{ url }}"
    owner: "{{ ansible_user|default('ec2-user') }}"
    group: "{{ ansible_user|default('ec2-user') }}" 

现在默认调用此角色,它将设置文件的默认所有者和组属性 但是,当我从不同的剧本

调用相同的 include_role 时,如果我不喜欢 invoke/use 所有者和组属性怎么办

我可以在 Download_role 所有者和群组周围添加 if / else 吗?在角色中 或任何其他可靠的魔术方法?

default过滤器的应用在这里没有意义

    owner: "{{ ansible_user|default('ec2-user') }}"

变量ansible_user总是被定义。


回答你的问题:

问:"Can I add if/else in the 'Download_role' surrounding the owner and group? In the role or any other Ansible magic method?"

答:有if/else和魔术两种方法。可以使用 if / else

    owner: "{{ 'userA'  if my_condition else 'userB' }}"

,或 ternary 过滤器

    owner: "{{ my_condition|ternary('userA', 'userB') }}"

这将 selection 限制为只有两个选项。将 my_condition 替换为布尔变量或逻辑表达式。


最佳做法是在 defaults/main.yml 中定义角色的默认值。例如,角色的默认值可能类似于

shell> cat roles/utilities/defaults/main.yml
my_user: user_A

那么角色utilities中参数owner的值默认为user_A

    owner: "{{ my_user }}"

魔法来了。可以 select 具有默认值的文件 defaults_from 当角色被 include_role 包含时。例如,让我们创建额外的默认文件

shell> cat roles/utilities/defaults/opt_B.yml
my_user: user_B

shell> cat roles/utilities/defaults/opt_C.yml
my_user: user_C

然后,例如,让我们在包含的角色

中使用文件opt_B.yml中的默认值
- name: Download
  include_role:
    name: utilities
    tasks_from: download
    defaults_from: opt_B.yml

Variable precedence: Where should I put a variable?