Я хочу изменить ansible_default_ipv4, чтобы указать eth1 вместо eth0. Могу ли я это сделать либо в книжке, либо с помощью опции -extra-vars?
Как вы меняете ansible_default_ipv4?
Ответ 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
везде, где это необходимо!