Вопрос или проблема
У нас есть две строки (названные мастер/слейв), которые состоят из 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
Принципы работы методологии
-
Определение подсетей: Каждая группа IP-адресов из списков master и slave должна принадлежать разным подсетям. Поскольку мы работаем с подсетями /24, это означает, что первые три октета адреса должны быть различными между адресами master и slave.
-
Сопоставление пар: Необходимо создать пары между адресами 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";
}
Объяснение
-
Группировка адресов по подсетям: Используем оператор
substr
иrindex
для извлечения подсетей из IP-адресов. Мы создаем хэши, где ключом является подсеть, а значением – массив IP-адресов, принадлежащих к этой подсети. -
Создание пар: Мы сравниваем подсети и создаем пары, только если они различны.
-
Вывод: Пары выводятся в формате ‘slave_ip => master_ip’.
Заключение
Следуя этому подходу, вы сможете создать пары master/slave IP-адресов, находящихся в разных подсетях. Запуск представленного перлового скрипта даст ожидаемый результат. Если у вас возникли дополнительные вопросы или вам требуется доработка скрипта, пожалуйста, дайте знать!