Как получить 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)