Ansible, конфигурация pg_hba.conf с IP-адресами из файла hosts

У меня проблема, и я даже не начал правильно.

у меня есть файл hosts, который выглядит так

all:
  children:
    application1:
      children:
        application1-webserver:
          hosts:
            host1.domain.net:
            host2.domain.net:
        application1-database:
          hosts:
            dbhost1.domain.net:
    application2:
      children:
        application2-webserver:
          hosts:
            host3.domain.net:
            host4.domain.net:
        application1-database:
          hosts:
            dbhost2.domain.net:
    app-servers:
      hosts:
            host1.domain.net:
            host2.domain.net:
            host3.domain.net:
            host4.domain.net:

Я создал файл шаблона. Я знаю, что это не pg_hba.conf, но сейчас это неважно, если я получу IP-адреса, это будет легко

{% for i in groups['app-servers'] %}
{{ hostvars[i]['ansible_default_ipv4_address'] }}
{% endfor %}

Так что, возможно, время от времени мне приходится запускать этот скрипт для создания «новой» среды, и я не хочу вручную менять IP-адреса с серверов приложений. Я хочу получить IP от FQDN.

Это нужно, чтобы я мог ограничить доступ к БД из сети только этими серверами.

Спасибо за помощь.


person dzecevic    schedule 13.11.2019    source источник
comment
Я не уверен, что понимаю, в чем проблема. Вы получаете сообщение об ошибке при попытке использовать этот шаблон? На первый взгляд выглядит нормально.   -  person larsks    schedule 14.11.2019
comment
Да, я получаю фатальную ошибку: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_default_ipv4_address'"} Запускаю это на одном тестовом сервере, который у меня есть. У меня есть сетевой доступ ко всем серверам   -  person dzecevic    schedule 14.11.2019


Ответы (2)


Переменная, содержащая глобальную информацию, — ansible_default_ipv4. Он доступен только в том случае, если вы собрали факты на своем хосте (убедитесь, что вы не использовали gather_facts: false в своей игре).

Это хэш, содержащий несколько ключей, среди которых address. В качестве примера (запутанного) это то, что я получаю на своем локальном хосте:

$ ansible localhost -m setup -a gather_subset=network -a filter=*default_ipv4*
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "x.y.z.a",
            "alias": "interface",
            "broadcast": "x.y.z.255",
            "gateway": "x.y.z..1",
            "interface": "interface",
            "macaddress": "xx:xx:xx:xx:xx:xx",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "x.y.z..0",
            "type": "ether"
        }
    },
    "changed": false
}

Таким образом, имя переменной, которую вы ищете в своем шаблоне, ansible_default_ip4.address.

Ваш полный фиксированный шаблон:

{% for i in groups['app-servers'] %}
{{ hostvars[i].ansible_default_ipv4.address }}
{% endfor %}

Возможные альтернативные обозначения (смешение точек и массивов):

{{ hostvars[i]['ansible_default_ipv4']['address'] }}
{{ hostvars[i].ansible_default_ipv4['address'] }}
etc.
person Zeitounator    schedule 14.11.2019

Итак, я понял. Это немного сложно.

Плейбук выглядит так:

---
- hosts: app-servers
  tasks:
    - ping:

- hosts: dbhost1.domain.net
  tasks:
    - include_role:
        name: test-for
...

Файл hosts, как указано выше:

all:
  children:
    application1:
      children:
        application1-webserver:
          hosts:
            host1.domain.net:
            host2.domain.net:
        application1-database:
          hosts:
            dbhost1.domain.net:
    application2:
      children:
        application2-webserver:
          hosts:
            host3.domain.net:
            host4.domain.net:
        application1-database:
          hosts:
            dbhost2.domain.net:
    app-servers:
      hosts:
            host1.domain.net:
            host2.domain.net:
            host3.domain.net:
            host4.domain.net:

Только после того, как я пингую хосты, я получаю IP-адреса, которые мне нужны

Затем в шаблоне:

{% for i in groups['app-servers'] %}
{{ hostvars[i].ansible_default_ipv4.address }}
{% endfor %}

И это работает.

Спасибо

person dzecevic    schedule 14.11.2019