【问题标题】:Using facts from one host group to configure another host group with Ansible使用来自一个主机组的事实通过 Ansible 配置另一个主机组
【发布时间】:2016-12-31 20:05:29
【问题描述】:

我正在尝试使用来自另一组主机 [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 方法是什么?

【问题讨论】:

  • 您能否针对其中一台服务器运行setup 模块并粘贴输出。可能没有ansible_eth0
  • 可能 etcd 上没有 eth0。或者,有一次我在将 iptables 更改为 firewalld 时遇到了同样的错误(一些依赖的包被删​​除为“未使用”)
  • 谢谢。这是针对 etcd 服务器运行的设置模块:gist.github.com/ae6rt/44f2567e287dd502e714b811bcd0ba92。 eth0 确实存在。
  • 我应该包含我的 Ansible 版本: $ ansible --version ansible 2.1.1.0 配置文件 = /Users/mpetrovic/Projects/ae6rt/ansible-other-hosts/ansible.cfg 配置的模块搜索路径= 默认无覆盖

标签: ansible ansible-facts


【解决方案1】:

如果你想使用某个主机的事实,你应该先收集它们。
[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

【讨论】:

  • 完美运行。非常感谢。
  • 后续问题:当我遍历 etcd 主机组时,我希望能够在模板中使用 etcd 服务器的名称,因为该名称出现在清单主机文件中。也就是说,在模板中,如何引用服务器以处理返回的值“etcd01”、“etcd02”和“etcd03”?
  • 我刚想通了,很明显:对于这个表达式,我需要的可以在 host 值本身中:{% for host in groups['etcd '] %}https://{{host}}:2379{% if not loop.last %},{% endif %}{% endfor %}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2016-05-22
  • 2010-10-11
相关资源
最近更新 更多