Как получить IP-адрес имени хоста внутри шаблона jinja

Наша соляная арка основана на именах хостов (webN., dbN. и т.д.). Но для разных вещей мне нужны IP-адреса этих серверов. Пока я их хранили в столбах, но количество мест, которые мне нужно синхронизировать, растет.

Я попытался использовать publish + network.ip_addrs, но это отвратительно, потому что для разрешения имени хоста необходимо выполнить весь цикл round-roundtrip. Также это зависит от ответов миньонов. Поэтому я ищу способ разрешить имя хоста для IP в шаблонах.

Я предполагаю, что я мог бы как-то написать модуль, но мои навыки python очень ограничены.

Ответ 1

Вы можете использовать произвольное зерно. Создайте файл _grains/fqdn_ip.py в каталоге дерева состояний:

import socket

def fqdn_ip():
    return {
        'fqdn_ip': socket.gethostbyname(socket.getfqdn())
    }

В шаблоне:

{{ grains.fqdn_ip }}

Другим способом является использование модуля dnsutil (требуется команда dig на minion):

{{ salt['dnsutil.A']('host.name.tld')[0] }}

Ответ 2

Я вижу это: http://cnygaard.blogspot.com.es/2012/11/how-to-template-eth0-address-with.html

Это простой способ, который я нашел.

#init.sls:

...
...

/etc/swift/proxy-server.conf:              
   file:
     - managed                              
     - source: salt://swift/proxy-server.conf
     - template: jinja
     - context:
         proxy_ip: {{ salt['network.interfaces']()['eth0']['inet'][0]['address'] }}

И затем:

#In proxy-server.conf

...

[filter:cache]
use = egg:swift#memcache
memcache_servers = {{ proxy_ip }}:11211

Ответ 3

Это очень старая запись, но она высоко оценивается в Google за получение адреса ipv4. Начиная с версии 2015.5.8, лучший способ получить основной адрес ipv4 - это {{ grains['ipv4'][0] }}.

Ответ 4

В настоящее время - для агрегирования списка всех IP-адресов требуется либо соляная шахта, либо опрос всех миньонов. Я предпочитаю соляную шахту.

Существует проблема, связанная с распространением новой системы реестров для поддержки адресов всех миньонов, а не только узлов на основе ssh. https://github.com/saltstack/salt/issues/7759

Ответ 5

Прочитав доступную документацию, я нашел гораздо более простое решение. Вот мои результаты.

введите в шаблон следующее:

lookup hostname: {{ lookup('dig', 'google.ca.') }}

Мой шаблон jinja2:

# mytemplate.j2
## lookup directly
lookup hostname: {{ lookup('dig', 'google.ca.') }}

## in a variable
{% set fqdn = 'google.ca' %}
lookup hostname: {{ lookup('dig', fqdn) }}

Результат:

# mytemplate.j2
## lookup directly
lookup hostname: 172.217.2.163

## in a variable
lookup hostname: 172.217.2.163

Ответ 6

Просто напоминание, вы всегда можете передать его из приложения Flask.

import os

host = os.uname()[1]

return render_template("template.html", host=host)