Как вы меняете ansible_default_ipv4?

Я хочу изменить ansible_default_ipv4, чтобы указать eth1 вместо eth0. Могу ли я это сделать либо в книжке, либо с помощью опции -extra-vars?

Ответ 1

ansible использует команду ip -4 route get 8.8.8.8, чтобы получить интерфейс ipv4 по умолчанию. Вы можете изменить таблицы ip/routing, чтобы сделать eth1 маршрут по умолчанию, и он вернет его.

Или вы можете использовать пользовательский факт.

PS: использование set_fact для переопределения факта ansible_default_ipv4, но у него есть собственные ошибки из-за кэширования, области видимости,...

Ответ 2

Другая опция всегда ссылается на ваш интерфейс явно. Различные облачные провайдеры имеют разные соглашения о погоде для размещения частной (обычно 10.x.y.z) сети управления на eth0 или eth1.

Вместо ссылки

ansible_default_ipv4["address"]

Вы всегда можете определить iface, который вы хотите (скажем, в group_vars/all)

iface: eth0

и ссылаться на него в задачах как

{{'ansible _' + iface ['ipv4'] ['address']}}

Простой grep покажет вам все ссылки. Глобальная находка и замена в вашем проекте позволит вам изменить это.   grep -RH ansible_default_ipv4 .

Затем, когда вы хотите переключить облачные провайдеры, вы просто приспосабливаете iface по мере необходимости.

Если вы предпочитаете что-то менее подробное и более явное определение

private_iface: eth0  #switch eth0,eth1 depending on your provider.
public_iface: eth1
private_host_ipv4: "{{ 'ansible_'+private_iface['ipv4']['address'] }}"
public_host_ipv4: "{{ 'ansible_'+public_iface['ipv4']['address'] }}"

и используйте только

ansible_default_ipv4

если вы хотите обратиться к личным или общедоступным IP-адресам, которые будут использоваться для доступа к 8.8.8.8 (интернет в целом).

BTW, я попробовал предложение Eron Wright для маршрута add -net 8.8.8.8 netmask 255.255.255.255 eth1. Кажется, это не работало для меня, и я не смог выполнить ping google (хотя pinging любой другой публичный ip работал).

Ответ 3

ip -4 route get 8.8.8.8 не работал на моем сервере.

Я создал эту работу.

- name: find default ipv4... this is a bit of a hack. shell: ifconfig $(route | grep default | awk '{print $(NF)}') | grep 'inet' | awk '{ print $2}' register: ipv4_address

Теперь я могу использовать ipv4_address везде, где это необходимо!