Сильная переменная IP-адреса - хост-часть
У меня есть следующая проблема:
Я пишу книгу для настройки IP-адреса в командной строке в Ansible. Допустим, 10.10.10.x. Мне нужно получить последнюю часть моего публичного IP-адреса, чтобы сказать xxx15 и назначить его частному: 10.10.10.15. Есть ли переменная для этого? Могу ли я захватить некоторые? Я попытался использовать что-то вроде:
shell: "ip addr show | grep inet ...."
register: host_ip
Но это не то, что мне нужно. Он работает, но только для ограниченного числа серверов.
Все должно быть так:
"shell: /dir/script --options 10.10.10.{{ var }}"
и {{ var }}
должны быть главной частью публичного IP-адреса.
Редактировать:
Спасибо! Здесь мое окончательное решение:
- name: Get the host part of the IP
shell: host {{ ansible_fqdn }} | awk '{print $4}'
register: host_ip
А также
{{ host_ip.stdout.split('.')[3] }}
Для использования позже в учебнике.
Ответы
Ответ 1
Вместо использования системной утилиты вы можете использовать доступные факты, хотя вы обнаружите, что имена интерфейсов будут отличаться от сервера к серверу.
Вы специально упоминали последнюю часть моего публичного IP-адреса
Если вы действительно имеете в виду ваш общедоступный IP-адрес, вам нужно будет использовать внешнюю службу для его получения, поскольку ваш сервер может за NAT. Вот один из вариантов
shell: wget -qO- http://ipecho.net/plain ; echo
register: host_ip
Это даст вашему публичному IP-адресу, чтобы получить последний октет, вы можете сделать что-то вроде:
{{ host_ip.stdout.split('.')[3] }}
Ответ 2
Как упоминалось jarv, это можно получить, используя факты.
Это можно сделать следующими способами:
Список всех адресов ipv4:
{{ ansible_all_ipv4_addresses }}
Для адреса ipv4 по умолчанию:
{{ ansible_default_ipv4.address }}
Если вы знаете, что ip-адрес находится в интерфейсе eth0:
{{ ansible_eth0.ipv4.address }}
Затем вы можете добавить метод .split('.')[3]
к переменной, чтобы получить соответствующий вывод, например {{ ansible_default_ipv4.address.split('.')[3] }}
Ответ 3
Это похоже на его получение:
- name: Get the local IP
local_action:
module: uri
url: http://checkip.amazonaws.com/
return_content: yes
register: ip_lookup
- set_fact:
local_ip: "{{ ip_lookup.content | regex_replace('\n','') }}"
- debug: var=local_ip