3

我正在尝试使用来自另一组主机[etcd]的事实来配置一组主机[nodes ] 。这是我的主机文件

[掌握]
Kubernetes ansible_ssh_host=10.2.23.108

[节点]
n1 ansible_ssh_host=10.2.23.192
n2 ansible_ssh_host=10.2.23.47

[等]
etcd01 ansible_ssh_host=10.2.23.11
etcd02 ansible_ssh_host=10.2.23.10
etcd03 ansible_ssh_host=10.2.23.9

请注意,组[etcd]不是配置的目标 - [nodes]是。但是配置[nodes]需要了解[etcd]的事实。

这是我的剧本:

---
- 名称:配置公用
  主机:节点
  须藤:是的
  任务:
    - 名称:etcd 端点
      文件:dest=/etc/kubernetes 状态=目录

    - 名称:etcd 端点
      模板:src=files/k.j2 dest=/etc/kubernetes/apiserver

最后,这里是 files/k.j2 的模板

KUBE_ETCD_SERVERS="--etcd_servers="{% for host in groups['etcd'] %}https://{{hostvars[host]['ansible_eth0']["ipv4"]["address"]}}:2380 {% if not loop.last %},{% endif %}{% endfor %}"

目标是生成一个 KUBE_ETCD_SERVERS 值,看起来像

--etcd_servers=https://10.2.23.11:2380,https://10.2.23.10:2380,https://10.2.23.10:2380

当我运行这个剧本时,我得到控制台输出

任务 [etcd 端点] ********************************************* *************
致命:[n1]:失败!=> {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' 没有属性 'ansible_eth0'"}
致命:[n2]:失败!=> {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' 没有属性 'ansible_eth0'"}

使 etcd 事实可用于节点播放的惯用 Ansible 方法是什么?

4

1 回答 1

4

如果你想使用某个主机的事实,你应该先收集它们。在[etcd]
主机上 运行setup任务以填充.hostvars

---
- name: Gather etcd facts
  hosts: etcd
  tasks:
    - setup:

- name: Configure common
  hosts: nodes
  sudo: True
  tasks:
    - name: etcd endpoints
      file: dest=/etc/kubernetes state=directory

    - name: etcd endpoints
      template: src=files/k.j2 dest=/etc/kubernetes/apiserver
于 2016-08-24T17:56:06.857 回答