it-roy-ru.com

Переменная IPsible IP-адрес - часть хоста

У меня есть следующая проблема:

Я пишу Playbook для установки IP-адреса в командной строке в Ansible. Скажем 10.10.10.х. Мне нужно получить последнюю часть моего публичного IP, скажем, x.x.x.15 и назначить его частному: 10.10.10.15. Есть ли переменная для этого? Могу ли я захватить некоторые? Я пытался использовать что-то вроде:

Shell: "ip addr show | grep inet ...." 
register: Host_ip

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

Все должно быть так:

"Shell: /dir/script --options 10.10.10.{{ var }}"

и {{ var }} должен быть частью Host публичного IP.

Правка:

Спасибо! Вот мое окончательное решение:

- name: Get the Host part of the IP 
  Shell: Host {{ ansible_fqdn }} | awk '{print $4}' 
  register: Host_ip 

А также

{{ Host_ip.stdout.split('.')[3] }}

Для использования позже в playbook.

12
plamer

Вместо использования системной утилиты вы можете использовать ansible fact , хотя вы обнаружите, что имена интерфейсов будут отличаться от сервера к серверу. 

Вы специально упомянули последняя часть моего публичного IP

Если вы действительно имеете в виду публичный IP вам нужно будет использовать внешний сервис, чтобы получить его, поскольку ваш сервер может работать за NAT. Вот один вариант

Shell: wget -qO- http://ipecho.net/plain ; echo
register: Host_ip

Это даст ваш публичный IP-адрес, рядом с последним октетом, который вы могли бы сделать что-то вроде:

{{ Host_ip.stdout.split('.')[3] }}
11
jarv

Как упомянуто 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] }}

11
Willem van Ketwich

Это аналогичный способ получить это:

- 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
0
joscas