Ansible从一个target node取值并赋值给所有的target node

Ansible操作三个node,其中有一个pod(app_api_pod_name)运行其中的一个上。
Step 1 需要判断这个pod中有没有存在一个文件,这个地方希望只在第一个node1上执行就可以了,这样其他的node都会skip,
如果是这样skip其他的node的时候,仍然会进行赋值,导致最后的结果是CA_exist无法registe,除了node1,其他node拿到CA_exist都是空值。
所以这个地方就理解了,ansible的所有变量,包括常量和临时变量都是按node进行区分和隔离的,不能共享。

Step 2 就是用来解决这个问题,在其他的node的变量组把这个值给赋值上,关键取值 hostvars[groups[‘role_control’][0]].CA_exist.rc

1
2
3
4
5
6
7
8
9
10
11
12
13

- name: check if CA exist in app-api
become: yes
shell: "kubectl exec -it {{ app_api_pod_name.stdout_lines[0] }} cat /etc/pki/ca-trust/source/anchors/xxxca.pem -n xxxx"
ignore_errors: yes
register: CA_exist
when: "inventory_hostname == groups['role_control'][0] and app_api_pod_name is defined"

- name: set if need to copy CA
set_fact:
need_copy: "{{ hostvars[groups['role_control'][0]].CA_exist.rc }}"
when: "hostvars[groups['role_control'][0]].CA_exist is defined and hostvars[groups['role_control'][0]].CA_exist.rc == 1"

Notice: 正常情况下,这里会有一个基于utteranc.es的留言系统,如果看不到,可能需要科学上网方式。