Ansible 获取清单主机组的主机名和 IP

Ansible Get Host Name and IP for Inventory Host groups

我正在尝试获取主机的主机名和 IP 地址并将它们保存到文件中。

我有这个解决方案;

- name: Create File with hosts and IP address.
  when: inventory_hostname in groups['local']
  lineinfile:
    dest: "{{store_files_path}}/{{ansible_date_time.date}}/{{ansible_date_time.time}}/hosts.txt"
    create: yes
    line: "{{hostvars[inventory_hostname].ansible_hostname}}:{{hostvars[inventory_hostname].ansible_default_ipv4.address}}"

但问题出在我的主机文件中,我有两个组,localServers。我只想得到 Servers 而不是 local 组,它只是 localhost

我试过下面的行,但它不起作用,它给我一个错误。

line: "{{ hostvars[ groups['Servers'][0] ].ansible_hostname }} :{{ hostvars[ groups['Servers'][0] ].ansible_default_ipv4.address }}"

我四处搜索了一下,这就是我找到的,我应该怎么做?

我会为此使用神社模板 :

# hosts_file.j2
{% for server in groups['Servers'] %}
{{hostvars[server]['ansible_facts']['hostname']}}:{{hostvars[server]['ansible_facts']['default_ipv4']['address']}}
{% endfor %}
- hosts: localhost
  tasks:
    - name: create hosts file from template
      template: 
        src: hosts_file.j2
        dest: {{store_files_path}}/{{ansible_date_time.date}}/{{ansible_date_time.time}}/hosts.txt

你把事情弄得非常复杂。

  1. 您不必通过 hostvars 来实现您想要的,special variables 主要为您提供有关 Ansible 当前正在执行的主机的信息。 Ansible为主机收集的事实也是如此。
  2. 对于手头的事情,您可以使用另一个 special variable group_names,它可以让您以列表的形式获得您当前正在操作的主机所在的组。因此,获取属于某个组的主机就像 when: "'group_that_interest_you' in group_names"
  3. 一样简单

鉴于库存:

all:
  vars:
    ansible_python_interpreter: /usr/bin/python3

  children:
    local:
      hosts:
        localhost:

    Servers:
      hosts:
        foo.example.org:
          ansible_host: 172.17.0.2

剧本:

- hosts: all
  gather_facts: yes
      
  tasks:
    - debug:
        msg: "{{ ansible_hostname }}:{{ ansible_default_ipv4.address }}"
      when:  "'Servers' in group_names"

这产生了回顾:

PLAY [all] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [localhost]
ok: [foo.example.org]

TASK [debug] ********************************************************************************************************
skipping: [localhost]
ok: [foo.example.org] => {
    "msg": "8088bc73d8cf:172.17.0.2"
}

PLAY RECAP **********************************************************************************************************
foo.example.org            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

现在,如果您将其改编成自己的剧本,您就可以开始了:

- name: Create File with hosts and IP address.
  lineinfile:
    dest: "{{ store_files_path }}/{{ ansible_date_time.date }}/{{ ansible_date_time.time }}/hosts.txt"
    create: yes
    line: "{{ ansible_hostname }}:{{ ansible_default_ipv4.address }}"
  when:  "'Servers' in group_names"
  delegate_to: localhost