snippetkubernetesMinor
How to use facts from one host to perform actions on another host?
Viewed 0 times
actionsonehostperformanotherhowfromfactsuse
Problem
In Ansible I'm trying to generate a variable from a task on one host and then use the variable to do something to another host. Specifically, I'm trying to create a Kubernetes cluster - On the control plane node I can save the join command into a variable, but this appears to be scoped to the source host only - I can't work out how to access that variable from another host.
The above fails on the second task (The task includes an option with an undefined variable. the error was: 'dict object' has no attribute 'stdout'). The standard approach seems to be save the line to a file locally, copy the file to the worker nodes and execute it locally which seems cumbersome (and leaves the join token lying around).
How can I achieve this with variables only?
- name: read join command from the controlPlane
shell: kubeadm token create --print-join-command
when: inventory_hostname in groups['controlPlane']
register: joinCmd
- name: join worker nodes to cluster
command: "{{ joinCmd.stdout }}"
when: inventory_hostname in groups['workerNodes']The above fails on the second task (The task includes an option with an undefined variable. the error was: 'dict object' has no attribute 'stdout'). The standard approach seems to be save the line to a file locally, copy the file to the worker nodes and execute it locally which seems cumbersome (and leaves the join token lying around).
How can I achieve this with variables only?
Solution
I found a solution - the trick here is delegate_to and delegate_facts:
The first task kind of reads backwards to my mind - when says 'run this task on all the workerNode hosts...' but delegate_to says '..but actually run it on a different host'. It works for me though (I've only got 1 host in controlPlane group, not sure of outcome with more hosts).
- hosts: all
remote_user: ansible
become: false
tasks:
- name: read join line from controlPlane
shell: kubeadm token create --print-join-command
when: inventory_hostname in groups['workerNodes']
register: joinCmd
delegate_to: "{{ item }}"
delegate_facts: true
with_items: "{{ groups['controlPlane'] }}"
- name: join all worker nodes to cluster
command: "{{ joinCmd.results[0].stdout }}"
become: yes
when: inventory_hostname in groups['workerNodes']The first task kind of reads backwards to my mind - when says 'run this task on all the workerNode hosts...' but delegate_to says '..but actually run it on a different host'. It works for me though (I've only got 1 host in controlPlane group, not sure of outcome with more hosts).
Code Snippets
- hosts: all
remote_user: ansible
become: false
tasks:
- name: read join line from controlPlane
shell: kubeadm token create --print-join-command
when: inventory_hostname in groups['workerNodes']
register: joinCmd
delegate_to: "{{ item }}"
delegate_facts: true
with_items: "{{ groups['controlPlane'] }}"
- name: join all worker nodes to cluster
command: "{{ joinCmd.results[0].stdout }}"
become: yes
when: inventory_hostname in groups['workerNodes']Context
StackExchange DevOps Q#13983, answer score: 2
Revisions (0)
No revisions yet.