Ansible: 在特定主机上使用另一个主机的变量/事实运行任务

82次阅读
没有评论

问题描述

在使用Ansible时,希望在组managers中的第一个主机上执行一个命令,并将其输出应用到同一组中的其他主机上。然而,他在运行任务时遇到了问题。
以下是用户提供的相关文件内容:
hosts文件:

[managers]
k8s01
k8s02
k8s03
[workers]
worker1
worker2
...

main.yaml文件:

- name: Create token to join cluster
  shell: kubeadm token create --print-join-command
  run_once: true
  changed_when: false
  when: inventory_hostname == groups['managers'][0]
  register: kubernetes_join_command_result

- name: Set join command for managers
  set_fact:
    kubernetes_join_command_controlplane: "{{ kubernetes_join_command_result.stdout }} --control-plane"
  when: kubernetes_join_command_result.stdout is defined
  delegate_to: "{{ item }}"
  delegate_facts: true
  with_items: "{{ groups['managers'] }}"

- name: Debug var
  debug:
    msg: 'Join Command: {{ kubernetes_join_command_result.stdout }}'

- name: Join managers into cluster
  shell: "{{ kubernetes_join_command_controlplane.stdout }}"
  args:
    warn: no
  when: inventory_hostname != groups['managers'][0] and inventory_hostname in groups['managers']

用户希望在主机k8s02k8s03上运行Join managers into cluster任务,但实际上只有k8s01上的任务被执行了。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,我们可以看到在Join managers into cluster任务中,使用了一个条件来判断是否执行任务。根据回答2的最佳答案,我们可以尝试修改任务的with_itemsdelegate_to属性,以确保任务在所有managers组的主机上执行。
以下是修改后的任务:

- name: Join managers into cluster
  shell: "{{ kubernetes_join_command_controlplane.stdout }}"
  args:
    warn: no
  when: inventory_hostname != groups['managers'][0] and inventory_hostname in groups['managers']
  delegate_to: "{{ item }}"
  delegate_facts: true
  with_items: "{{ groups['managers'] }}"

在上面的示例中,我们添加了with_itemsdelegate_to属性,并将其设置为{{ groups['managers'] }}。这将确保任务在所有managers组的主机上执行。

方案2

根据设计和范围的不同,你也可以尝试将主机设置为allmanagers,以确保任务在所有主机或managers组的主机上执行。
以下是修改后的任务:

- name: Join managers into cluster
  shell: "{{ kubernetes_join_command_controlplane.stdout }}"
  args:
    warn: no
  when: inventory_hostname != groups['managers'][0] and inventory_hostname in groups['managers']
  delegate_to: "{{ item }}"
  delegate_facts: true
  with_items: "{{ groups['managers'] }}"
  hosts: all

在上面的示例中,我们将hosts属性设置为all,这将确保任务在所有主机上执行。你也可以将其设置为managers,以确保任务仅在managers组的主机上执行。
请根据你的具体需求选择适合的方案。

正文完