如何在ansible中获取kubernetes节点名和IP地址作为字典?

狼行天下 发表于: 2019-12-15   最后更新时间: 2019-12-15 23:27:29   2,033 游览

我需要获取每个节点的节点名称和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地址获取到字典对象中?

发表于 2019-12-15
添加评论

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 }}"
你的答案

查看kubernetes相关的其他问题或提一个您自己的问题