Ansible:如何从Ansible的FQDN获取IP地址?

时间:2017-06-08 22:10:17

标签: ansible ansible-inventory ansible-facts

所以,这是设置。

我通过额外的vars将FQDN列表传递给了剧本,但是控制机器的键被复制了相应的IP地址。此外,他们在清单中没有特定的这些组。

这个剧本的主持人是一个服务器,它可能是也可能不是我通过额外的vars传递的列表的一部分。因此,剧本并没有任何关于这些节点的事实。

所以,我的问题是我如何动态获取相应主机的IP地址,以便我可以循环它们对我通过另一个剧本使用FQDN设置的某些属性进行一些检查/角色以前。 (注意:我严格要求FQDN设置这些属性)

我已经使用了delegate_to模块,并且传递了FQDN并且它可以工作,但是它询问我是否要继续连接(是/否)并等待初始运行的用户输入(如果给定是,它可以作为预期)。他们还有其他更简单,更清洁的方法来解决这个问题吗?
(注意:请记住,我不能修改库存内容,如放别名等)

以下是代码的片段:

- name: Checks
  become_user: hdfs
  shell: hdfs dfsadmin –report
  delegate_to: "{{ item.host_name }}"
  with_items:
    - "{{rackDetails}}"

以下是调用上述角色的主yml文件的片段:

- name: Checks for the property
  hosts: servernode
  roles:
    - Checks

库存代码段如下所示:

  

[servernode]
  10.0.2.15 ansible_ssh_user = grant ansible_ssh_pass = grant
  [全部]
  10.0.2.15 ansible_ssh_user = grant ansible_ssh_pass = grant
  10.0.2.16 ansible_ssh_user = grant ansible_ssh_pass = grant
  10.0.2.17 ansible_ssh_user = grant ansible_ssh_pass = grant
  10.0.2.18 ansible_ssh_user = grant ansible_ssh_pass = grant
  10.0.2.19 ansible_ssh_user = grant ansible_ssh_pass = grant

最后,这是我通过额外的变量传递的内容:

{"rackDetails":[{"host_name":"prod_node1.paas.com","rack_name":"/rack1"},{"host_name":"prod_node2.paas.com","rack_name":"/rack2"},{"host_name":"prod_node3.paas.com","rack_name":"/rack3"}]}

2 个答案:

答案 0 :(得分:2)

我想知道delegate_to是否有效,如果主机作为额外的vars传递但不能存在于库存中。

无论如何,您可以使用dig查找插件: http://docs.ansible.com/ansible/playbooks_lookups.html#the-dns-lookup-dig

{{ lookup('dig', item.host_name) }}

答案 1 :(得分:0)

我认为您想要的是将这些转换为FQDN到IP地址并将它们放入-l(限制)到剧本中:

ansible-playbook my_playbook -l $( getent hosts $( cat fqdns.txt ) | cut -d' ' -f1 | tr '\n' ',' )