Сильная переменная 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