Ansible 并将变量从之前的 include_role 传递给以下 include_role
Ansible and passing vars to the following include_role from a previous include_role
我试图将 Kubespray 的所有角色包装在 block/rescue 块中,所以我不得不从通常的 roles
包括如下:
- hosts: kube-master[0]
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
roles:
- { role: kubespray-defaults}
- { role: kubernetes-apps/rotate_tokens, tags: rotate_tokens, when: "secret_changed|default(false)" }
- { role: win_nodes/kubernetes_patch, tags: ["master", "win_nodes"]}
对此:
- hosts: kube-master[0]
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
vars:
roles:
- name: "kubespray-defaults"
- name: kubernetes-apps/rotate_tokens
tags: rotate_tokens
when: "secret_changed|default(false)"
- name: win_nodes/kubernetes_patch
tags: ["master", "win_nodes"]
- name: "ems-notification"
msg: kubespray-defaults, kubernetes-apps/rotate_tokens and win_nodes/kubernetes_patch completed
tasks:
- include_tasks: roles/a4-roles/tasks/main.yml
loop: "{{ roles }}"
a4-roles/tasks/main.yml 为:
- name: a4-roles
when: item.when | default(omit)
block:
- include_role:
name: "{{ item.name }}"
apply:
tags: >-
{%- if item.tags is defined -%}
"{{ item.tags }}"
{%- else -%}
""
{%- endif -%}
rescue:
- include_role:
name: "ems-notification"
vars:
msg: an error has occurred
host: "{{ inventory_hostname }}"
result: "{{ ansible_failed_result.msg | trim | default(omit) }}"
role: "{{ item.name }}"
error: "true"
问题是 kubespray-defaults
和其他角色正在设置一些变量和默认值,这些变量和默认值被 roles
块中的后续角色使用。
使用 include_role
时,那些变量和默认值就丢失了。有什么办法可以留住他们,并将他们传给下一个角色?
我找到了一种方法,只需使用 public
指令即可解决此问题。将其设置为 true
与以下所有角色共享默认值和变量。
我所要做的就是更改 a4-roles/tasks/main.yml 并使其像这样:
- name: a4-roles
when: item.when | default(omit)
block:
- include_role:
name: "{{ item.name }}"
public: true
apply:
tags: >-
{%- if item.tags is defined -%}
"{{ item.tags }}"
{%- else -%}
""
{%- endif -%}
rescue:
- include_role:
name: "ems-notification"
vars:
msg: an error has occurred
host: "{{ inventory_hostname }}"
result: "{{ ansible_failed_result.msg | trim | default(omit) }}"
role: "{{ item.name }}"
error: "true"
这仍在污染全局堆栈,因为这些默认值和变量正在与所有角色共享,而不仅仅是那些由我的循环处理的角色。 在我写这篇文章的时候,我认为没有更好的解决方案。