создать мастер/слейв IP в разных подсетях

Вопрос или проблема

У нас есть две строки (названные мастер/слейв), которые состоят из IP-адресов, распределенных по трем подсетям. Нужно создать пары из этих двух строк, где два адреса в каждой паре находятся в разных подсетях /24. Вот пример:

обе строки мастер/слейв имеют пять IP-адресов и распределены по трем подсетям 172.28.250/172.28.154/172.28.254

masters="172.28.250.99 172.28.250.101 172.28.154.41 172.28.154.52 172.28.254.30"
    
slaves="172.28.250.103 172.28.250.104 172.28.154.53 172.28.254.32 172.28.254.33"

итоговая сопоставление будет:

172.28.154.53 => 172.28.250.99

172.28.250.103 => 172.28.154.41

172.28.250.104 => 172.28.254.30

172.28.254.32 => 172.28.250.101

172.28.254.33 => 172.28.154.52
первые три раздела для IP-адресов слейв отличаются от мастеров

И я пробовал код, как предложил Стефан, вот так, мы можем поместить все IP-адреса в хэш и сопоставление, но теперь мастер уже указан, я могу работать только с IP-адресами слейв, это действительно создает мне headache. Буду благодарен за вашу помощь.

perl -e '
  push @{$s{s/\.\d+$//r}}, $_ for @ARGV;
  @l = values %s;
  for ($n = @ARGV; $n > 0; $n -= 2) {
    @l = sort {@$b <=> @$a} @l;
    printf "%s %s\n", pop(@{$l[0]}), pop(@{$l[1]});
  }' $nodes

Ответ или решение

Для решения задачи по созданию пар master/slave IP-адресов из разных подсетей (/24), давайте начнем с анализа проблемы и предоставим детальное решение. У вас есть два списка IP-адресов: один для master и один для slave, и вы хотите сопоставить их так, чтобы каждая пара адресов находилась в разных подсетях.

Исходные данные

У вас есть следующие IP-адреса:

  • Мастера (master):

    172.28.250.99
    172.28.250.101
    172.28.154.41
    172.28.154.52
    172.28.254.30
  • Слейвы (slave):

    172.28.250.103
    172.28.250.104
    172.28.154.53
    172.28.254.32
    172.28.254.33

Принципы работы методологии

  1. Определение подсетей: Каждая группа IP-адресов из списков master и slave должна принадлежать разным подсетям. Поскольку мы работаем с подсетями /24, это означает, что первые три октета адреса должны быть различными между адресами master и slave.

  2. Сопоставление пар: Необходимо создать пары между адресами master и slave, чтобы каждая пара находилась в разных подсетях.

Решение

Мы можем использовать перловый скрипт, который перебирает адреса master и slave, группирует их по подсетям и создает пары. Вот пример такого скрипта:

use strict;
use warnings;

my @masters = (
    "172.28.250.99",
    "172.28.250.101",
    "172.28.154.41",
    "172.28.154.52",
    "172.28.254.30"
);

my @slaves = (
    "172.28.250.103",
    "172.28.250.104",
    "172.28.154.53",
    "172.28.254.32",
    "172.28.254.33"
);

# Группируем по подсетям
my %master_subnets;
my %slave_subnets;

foreach my $master (@masters) {
    my $subnet = substr($master, 0, rindex($master, '.'));
    push @{$master_subnets{$subnet}}, $master;
}

foreach my $slave (@slaves) {
    my $subnet = substr($slave, 0, rindex($slave, '.'));
    push @{$slave_subnets{$subnet}}, $slave;
}

# Создаем пары
my @pairs;
foreach my $slave_subnet (keys %slave_subnets) {
    foreach my $master_subnet (keys %master_subnets) {
        if ($slave_subnet ne $master_subnet) {
            while (@{$master_subnets{$master_subnet}} && @{$slave_subnets{$slave_subnet}}) {
                my $master_ip = pop(@{$master_subnets{$master_subnet}});
                my $slave_ip = pop(@{$slave_subnets{$slave_subnet}});
                push @pairs, "$slave_ip => $master_ip";
            }
        }
    }
}

# Выводим результат
foreach my $pair (@pairs) {
    print "$pair\n";
}

Объяснение

  1. Группировка адресов по подсетям: Используем оператор substr и rindex для извлечения подсетей из IP-адресов. Мы создаем хэши, где ключом является подсеть, а значением – массив IP-адресов, принадлежащих к этой подсети.

  2. Создание пар: Мы сравниваем подсети и создаем пары, только если они различны.

  3. Вывод: Пары выводятся в формате ‘slave_ip => master_ip’.

Заключение

Следуя этому подходу, вы сможете создать пары master/slave IP-адресов, находящихся в разных подсетях. Запуск представленного перлового скрипта даст ожидаемый результат. Если у вас возникли дополнительные вопросы или вам требуется доработка скрипта, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...