如何通过在本地主机上运行playbook来获取ventory_hostanme和ansible_ssh_hosts信息

时间:2019-02-17 10:15:59

标签: ansible ansible-2.x ansible-inventory

我想将特定组下的主机名和ssh_host从清单文件写入本地主机中的文件。 我已经尝试过了:

my_role

  set_fact:
    hosts: "{{ hosts_list|default({}) | combine( {inventory_hostname: ansible_ssh_host} ) }}"
  when: "'my_group' in group_names"

剧本

  become: no
  gather_facts: no
  roles:
    - my_role

但是现在,如果我尝试将其写入另一个任务中的文件中,它将为清单文件中的主机创建一个文件。

请问是否可以通过在本地主机上运行playbook,找到一种更好的方法来创建一个包含字典的文件,该字典分别使用stock_hostname和ansible_ssh_host作为键和值。

2 个答案:

答案 0 :(得分:1)

一种选择是使用lineinfiledelegate_to本地主机。

- hosts: test_01
  tasks:
    - set_fact:
        my_inventory_hostname: "{{ ansible_host }}"
    - tempfile:
      delegate_to: localhost
      register: result
    - lineinfile:
        path: "{{ result.path }}"
        line: "inventory_hostname: {{ my_inventory_hostname }}"
      delegate_to: localhost
    - debug:
        msg: "inventory_hostname: {{ ansible_host }}
              stored in {{ result.path }}"

注意:无需引用条件。默认情况下会扩展条件。

when: my_group in group_names

答案 1 :(得分:0)

非常感谢您的答复@弗拉基米尔·博特卡

我提出了另一个要求,将属于某个组的主机写入文件,下面的代码可以帮助解决这个问题(添加到@Vladimir的解决方案中)。

- hosts: all
  become: no
  gather_facts: no
  tasks:
    - set_fact:
        my_inventory_hostname: "{{ ansible_host }}"
   - lineinfile:
        path: temp/hosts
        line: "inventory_hostname: {{ my_inventory_hostname }}"
      when: inventory_hostname in groups['my_group']
      delegate_to: localhost
    - debug:
        msg: "inventory_hostname: {{ ansible_host }}"