0

我正在尝试使用以下任务创建主机文件。我在完全不属于组['hadoop']的机器上运行此任务。在这里,我想为来自组 ['hadoop'] 的节点创建主机文件,而不是在组 ['hadoop'] 上运行我的这个游戏

- name: Update /etc/hosts
  lineinfile: dest=/etc/hosts
          regexp='.*{{ item }}$'
          line="{{ hostvars[item].ansible_default_ipv4.address }} {{item}}"
          state=present
  when: hostvars[item].ansible_default_ipv4.address is defined
  with_items: groups['hadoop']
  tags:
    - etc-hosts

我试过了,但没有用,只有当我的游戏主机中有组['hadoop']时它才有效。

有人知道我在这里做错了什么吗?

4

1 回答 1

1

Ansible 将通过设置模块检测 IP 等事实。默认情况下,这是在将由播放处理的那些主机上作为播放的第一个任务执行的。因此,Ansible 只知道当前戏剧的主持人的事实。不是该剧的一部分 -> 没有可用的详细信息。

要解决这个问题,您有两个选择。

1)添加一个没有任务的播放,只是为了在hadoop主机上运行设置模块。

---

 - hosts: hadoop
   gather_facts: yes

 - hosts: other hosts
   tasks: your actual tasks here

...

2) 启用事实缓存。顾名思义,事实缓存为 Ansible 提供了一种方法来记忆有关它在当前剧本中未处理的主机的事实。为此,您需要在本地或网络上的某个可用位置设置一个 redis 实例。

于 2016-03-14T17:11:40.767 回答