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

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

Я попытался использовать publish + network.ip_addrs, но это отстой, потому что ему нужно сделать всю соль-туда и обратно, чтобы решить имя хоста. Кроме того, это зависит от ответа миньонов. Поэтому я ищу способ разрешения имени хоста на IP в шаблоны.

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

5 ответов


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

import socket

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

В шаблоне:

{{ grains.fqdn_ip }}

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

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

Я видел это: 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

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


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

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


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

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

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