Use defined resource to populate template file

Я работаю над тем, чтобы сделать нашу марионеточную инфраструктуру более динамичной, где я могу добавить любое количество узлов, и они будут автоматически применяться в другой конфигурации узлов.

Пример: У меня есть 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,

0
задан 18 January 2016 в 17:15
3 ответа

Да, это можно сделать, обновив MAC-адреса источника и получателя перед повторной отправкой пакета в сеть, но оставив IP-адреса без изменений.

Этот принцип используется в некоторых DSR балансировщики нагрузки на основе. Цитата из сообщения в блоге HAProxy :

В режиме DSR балансировщик нагрузки направляет пакеты в бэкэнды, не меняя ничего, кроме MAC-адреса назначения.

0
ответ дан 5 December 2019 в 10:53

Если это Linux, я мог бы предложить изучить предварительную и пост-маршрутизацию. Взгляните на страницы руководства, это должно быть началом.

Если это приложение, в зависимости от вашего протокола, создайте свой собственный пакет с конечным IP-адресом назначения (что я должен был сделать).

Надеюсь это помогает!

0
ответ дан 5 December 2019 в 10:53

Обычно, чтобы это сделать, вам нужно сделать следующее:

  1. Убедиться, что хост C получит пакет, например, перехватив его на интерфейсе с помощью tcpdump или другой процедуры pcap на интерфейсе.

  2. Убедитесь, что пакет будет доставлен на хост C. Это зависит от используемого линкового уровня. Если предположить, что у вас есть ethernet и 1 интерфейс NIC на хост:

    1. Если вы используете Ethernet с хабом или правильно настроенным коммутатором, то пакеты могут просто транслироваться на оба порта.
    2. Если вы используете Ethernet-коммутатор с MAC-таблицей, вам придется изменить MAC-адрес назначения на хосте B, иначе коммутатор не будет маршрутизировать пакеты на C
    3. в случае Wi-Fi, например, так как он работает как хаб, вы можете просто иметь одинаковые MAC-адреса и IP-адреса на обоих ПК
  3. Тогда есть два варианта: или
    1. хост B должен получить пакет и создать его дубликат, или
    2. хост B должен просто переслать пакет на хост C (в данном случае хост C действует как шлюз по умолчанию для переадресации пакетов для хоста B, где хост B действует как маршрутизатор)

Поскольку ваш исходный вопрос не предполагает, что пакет на самом деле будет получен хостом B, а просто переадресован на хост C, я бы сделал следующее на хосте B:

  1. разрешить пересылку пакетов sysctl -w net. ipv4.ip_forward=1
  2. создаст правило для пересылки этого пакета в отдельной таблице с id 100, например ip правило add to 192.168.0.2 lookup 100
  3. in table with id 100 add the default gateway where the packet should go: ip маршрут добавить по умолчанию через 192.168.0.3 dev ethXXX, где ethXXX - это имя интерфейса соединения на C

, это, однако, сгенерирует цикл на хосте B, который будет разрешен только с помощью TTL, и сгенерирует избыточную нагрузку на сеть. Это самый простой способ.

Лучше иметь правильно сконфигурированный коммутатор, или отдельное соединение с хостом B->C для отправки этих пакетов. В одноинтерфейсном и неконфигурированном случае коммутатора вы всегда зациклитесь, если только не напишете специализированное программное обеспечение для этого, используя pcap, и вам всё равно придётся обманывать коммутатор, делая вид, что IP-адрес сконфигурирован.

.
0
ответ дан 5 December 2019 в 10:53

Теги

Похожие вопросы