2016-08-24 61 views
2

我想使用另一组主机的事实[etcd]配置一组主机[节点]。这里是我的hosts文件使用来自一个主机组的事实用Ansible配置另一个主机组

 
[master] 
kubernetes ansible_ssh_host=10.2.23.108 

[nodes] 
n1 ansible_ssh_host=10.2.23.192 
n2 ansible_ssh_host=10.2.23.47 

[etcd] 
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]不是配置的目标 - [节点]是。但配置[节点]需要知道[etcd]的事实。

这里是我的剧本:

 
--- 
- 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 

最后,这里是文件的模板/ 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 

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

 
TASK [etcd endpoints] ********************************************************** 
fatal: [n1]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_eth0'"} 
fatal: [n2]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_eth0'"} 

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

+1

你可以针对其中一台服务器运行'setup'模块并粘贴输出。可能是它没有'ansible_eth0' –

+0

etcd上可能没有'eth0'。或者,一旦我将iptables更改为firewalld时出现同样的错误(一些依赖包被删除为“未使用”) –

+0

谢谢。这里是安装模块在etcd服务器上运行:https://gist.github.com/ae6rt/44f2567e287dd502e714b811bcd0ba92。 eth0确实存在。 – ae6rt

回答

3

如果你想使用某些主机的事实,你应该先收集它们。
运行setup任务[etcd]主机填充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 
+0

完美工作。非常感谢你。 – ae6rt

+0

后续问题:当我遍历etcd主机组时,我希望能够在模板中使用etcd服务器的名称,因为该名称出现在库存主机文件中。也就是说,在模板中,我怎样才能以这种方式引用服务器,以便处理返回值“etcd01”,“etcd02”和“etcd03”? – ae6rt

+0

我刚刚弄明白了,很明显:对于这个表达式,我需要* host *值本身:{%for host ['etcd']%} https:// {{host} }:2379 {%if not loop.last%},{%endif%} {%endfor%} – ae6rt

相关问题