问题描述
在使用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']
用户希望在主机k8s02
和k8s03
上运行Join managers into cluster
任务,但实际上只有k8s01
上的任务被执行了。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据用户提供的信息,我们可以看到在Join managers into cluster
任务中,使用了一个条件来判断是否执行任务。根据回答2的最佳答案,我们可以尝试修改任务的with_items
和delegate_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_items
和delegate_to
属性,并将其设置为{{ groups['managers'] }}
。这将确保任务在所有managers
组的主机上执行。
方案2
根据设计和范围的不同,你也可以尝试将主机设置为all
或managers
,以确保任务在所有主机或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
组的主机上执行。
请根据你的具体需求选择适合的方案。
正文完