Я работаю над тем, чтобы сделать нашу марионеточную инфраструктуру более динамичной, где я могу добавить любое количество узлов, и они будут автоматически применяться в другой конфигурации узлов.
Пример: У меня есть X хостов, на которых запущено приложение Java, которые определены нашим модулем javaapp со следующим определением в нем (упрощенно):
define javaapp::site (
$site_name,
$site_port ) {
# Doing some stuff regarding deployment, service management etc here
}
Они определены в файле site.pp следующим образом:
javaapp::site { 'app01':
play_site_name => 'app01',
play_site_port => 9100,
}
У нас есть обратный прокси-сервер nginx перед этими серверами приложений, где мне нужно пересылать запросы на ряд серверов. В настоящее время мой шаблон nginx выглядит так:
upstream app-hosts {
server <%= @host_app_01 %>:9100;
server <%= @host_app_02 %>:9100;
}
Где @ host_app_01 и @ host_app_02 определены глобально в файле site.pp
Я бы хотел собрать массив узлов с конкретным именем сайта javaapp и используйте его в шаблоне nginx. Что-то вроде этого псевдокода:
upstream app-hosts {
<% @host_app.each do |host| %>
server <%= @host.ip %>:<%= @host.appPort %>;
<% end %>
}
Я немного читал об экспортированных ресурсах, но не могу понять, подходит ли это для данной ситуации?
Можно ли вообще использовать марионетку?
Мы используем марионеточную версию 3.7.5. B: 192.168.0.2/24 C: 192.168.0.3/24 On host A, I just ping host B once. This should generate a packet (A->B) ...
I have 3 hosts in the same subnet, each host has one network interface:
A: 192.168.0.1/24
B: 192.168.0.2/24
C: 192.168.0.3/24
On host A, I just ping host B once. This should generate a packet (A->B) and send to B. B receives the packet just fine.
Now the moment B receives the packet from A, how can I re-forward the same packet (A->B) to host C without changing any source or destination IP?
i.e. I literally want host C to receive the packet as (A->B), not (A->C) or (B->C)
Many thanks,
Да, это можно сделать, обновив MAC-адреса источника и получателя перед повторной отправкой пакета в сеть, но оставив IP-адреса без изменений.
Этот принцип используется в некоторых DSR балансировщики нагрузки на основе. Цитата из сообщения в блоге HAProxy :
В режиме DSR балансировщик нагрузки направляет пакеты в бэкэнды, не меняя ничего, кроме MAC-адреса назначения.
Если это Linux, я мог бы предложить изучить предварительную и пост-маршрутизацию. Взгляните на страницы руководства, это должно быть началом.
Если это приложение, в зависимости от вашего протокола, создайте свой собственный пакет с конечным IP-адресом назначения (что я должен был сделать).
Надеюсь это помогает!
Обычно, чтобы это сделать, вам нужно сделать следующее:
Убедиться, что хост C
получит пакет, например, перехватив его на интерфейсе с помощью tcpdump или другой процедуры pcap на интерфейсе.
Убедитесь, что пакет будет доставлен на хост C
. Это зависит от используемого линкового уровня. Если предположить, что у вас есть ethernet и 1 интерфейс NIC на хост:
B
, иначе коммутатор не будет маршрутизировать пакеты на C
B
должен получить пакет и создать его дубликат, или B
должен просто переслать пакет на хост C
(в данном случае хост C
действует как шлюз по умолчанию для переадресации пакетов для хоста B
, где хост B
действует как маршрутизатор)Поскольку ваш исходный вопрос не предполагает, что пакет на самом деле будет получен хостом B
, а просто переадресован на хост C
, я бы сделал следующее на хосте B
:
sysctl -w net. ipv4.ip_forward=1
ip правило add to 192.168.0.2 lookup 100
ip маршрут добавить по умолчанию через 192.168.0.3 dev ethXXX
, где ethXXX
- это имя интерфейса соединения на C
, это, однако, сгенерирует цикл на хосте B
, который будет разрешен только с помощью TTL
, и сгенерирует избыточную нагрузку на сеть. Это самый простой способ.
Лучше иметь правильно сконфигурированный коммутатор, или отдельное соединение с хостом B->C
для отправки этих пакетов. В одноинтерфейсном и неконфигурированном случае коммутатора вы всегда зациклитесь, если только не напишете специализированное программное обеспечение для этого, используя pcap, и вам всё равно придётся обманывать коммутатор, делая вид, что IP-адрес сконфигурирован.