我需要获取每个节点的节点名称和IP地址,然后创建字典对象。我可以使用以下命令获取Kubernetes节点列表
- hosts: k8s
tasks:
- name: get cluster nodes
shell: "kubectl get nodes -o wide --no-headers | awk '{ print $1 ,$7}'"
register: nodes
- debug: var=nodes
- set_fact:
node_data: {}
- name: display node name
debug:
msg: "name is {{item.split(' ').0}}"
with_items: "{{nodes.stdout_lines}}"
- set_fact:
node_data: "{{ node_data | combine ( item.split(' ').0 : { 'name': item.split(' ').0 , 'ip' : item.split(' ').1 }, recursive=True) }}"
with_items: "{{ nodes.stdout_lines }}"
- debug: var=node_data
我遇到以下错误:
FAILED! => {"msg": "template error while templating string: expected token ',', got ':'. String: {{ node_data | combine ( item.split(' ').0 : { 'name':item.split(' ').0 , 'ip': item.split(' ').1 }, recursive=True) }}"}
下面是kubectl
命令的输出
kubectl get nodes -o wide --no-headers | awk '{ print $1 ,$7}'
如下
> ip-192-168-17-93.ec2.internal 55.175.171.80
> ip-192-168-29-91.ec2.internal 3.23.224.95
> ip-192-168-83-37.ec2.internal 54.196.19.195
> ip-192-168-62-241.ec2.internal 107.23.129.142
如何在ansible中将节点名和ip地址获取到字典对象中?
Combine过滤器的第一个参数必须是字典:
- set_fact: node_data: "{{ node_data | combine ( item.split(' ').0 : { 'name': item.split(' ').0 , 'ip' : item.split(' ').1 }, recursive=True) }}" with_items: "{{ nodes.stdout_lines }}"
需要这样做:
- set_fact: node_data: "{{ node_data | combine ({item.split(' ').0 : { 'name': item.split(' ').0 , 'ip' : item.split(' ').1 }}, recursive=True) }}" with_items: "{{ nodes.stdout_lines }}"
请注意要合并的第一个参数新
{{...}
。为了干净,你可能需要考虑重新格式化此task:- set_fact: node_data: >- {{ node_data | combine ({ item.split(' ').0: { 'name': item.split(' ').0, 'ip': item.split(' ').1 }, }, recursive=True) }} with_items: "{{ nodes.stdout_lines }}"
甚至可以通过将对
item.split
的调用移到vars中来使其更加干净,如下所示:- set_fact: node_data: >- {{ node_data | combine ({ name: { 'name': name, 'ip': ip }, }, recursive=True) }} vars: name: "{{ item.split(' ').0 }}" ip: "{{ item.split(' ').1 }}" with_items: "{{ nodes.stdout_lines }}"
你的答案