bash на все хосты в сети

У меня регулярно появляется необходимость сделать определенные действия (ввести команды, положить нужные файлики) на всех или большинстве хостов в сети (все хосты linux). Конечно для решения таких задач существуют монстры типа ansible — но ради двух, трех команд «городить огород» не хочется. Куда проще воспользоваться командой sshpass в цикле по всем компам. Для этого я использую следующую конструкцию (выкладываю для себя, чтобы было откуда списать в следующий раз).

В примере я раскидываю на все машины файлик правил udev и выполняю ряд команд которые описаны в файле command.txt

# ll /root/temp/
-rwxr-xr-x 1 root root 79 апр 26 11:28 99-udisks2.rules
-rwxr-xr-x 1 root root 447 апр 26 11:35 all_uvd.sh
-rw-r--r-- 1 root root 173 апр 26 11:39 command.txt

# cat all_uvd.sh
!/bin/bash
for var in uvd14 uvd15 uvd16 uvd17 uvd18 uvd19 uvd20 uvd21 uvd22 uvd23
do
echo The $var item
scp /root/temp/99-udisks2.rules $var:/etc/udev/rules.d/99-udisks2.rules
cat /root/temp/command.txt | sshpass -p '***' ssh root@$var
done

# cat command.txt
yum -y install udiskie exfat-utils fuse-exfat ntfs-3g
systremctl enable udisks2
udevadm control --reload-rules
reboot

cisco catalist password reset

Процедура сброса пароля на маршрутизаторах и коммутаторах cisco отличается. Как обычно — необходим физический доступ к оборудованию и подключение к консоли.

Чтобы начать восстановление нужно выключить коммутатор, затем включить его с зажатой кнопкой mode. Так мы прерываем штатную загрузку.

Loading "flash:/c2960-lanbase-mz.122-25.FX.bin"…
#
Boot process terminated.
switch

Теперь вводим команды flash_init и load_helper. После из успешного выполнения становится доступным содержимое нашей flash памяти. Посмотреть его можно командой — dir flash: (двоеточие в конце команды)

switch: flash_init
Initializing Flash…
flashfs[0]: 3 files, 0 directories
flashfs[0]: 0 orphaned files, 0 orphaned directories
flashfs[0]: Total bytes: 64016384
flashfs[0]: Bytes used: 3059643
flashfs[0]: Bytes available: 60956741
flashfs[0]: flashfs fsck took 1 seconds.
…done Initializing Flash.
switch: load_helper
switch: dir flash:
Directory of flash:/
1 -rw- 3058048 c2950-i6q4l2-mz.121-22.EA4.bin
3 -rw- 979 config.text
2 -rw- 616 vlan.dat
60956741 bytes available (3059643 bytes used)

Интересует файл config.text — это и есть стартап-конфиг коммутатора. Чтобы коммутатор загрузился без него — его нужно переименовать, например так — rename flash:config.old flash:config.text.
Теперь коммутатор нужно перезагрузить в нормальном режиме — он загрузится без конфигурации. Если не стоит задача — сохранить старый конфиг — то на этом все.

Если старый конфиг сохранить нужно, то содержимое переименованного файла конфига нужно загрузить в running-config, добавить пользователя и сохранить конфигурацию.

Switch>en
Switch#rename flash:config.old flash:config.text
Switch#copy flash:config.text system:running-config

Теперь после того как конфиг загружен мы можем задать новый пароль

Switch1#conf t
Switch1(config)#enable secret NewPassword
Switch1(config)#enable password NewPassword
Switch1 (config)#line vty 0 4
Switch1 (config-line)#password NewPassword
Switch1 (config-line)#login
Switch1 (config-line)#exit
Switch1 (config)#line console 0
Switch1 (config-line)#password NewPassword
Switch1 (config-line)#login

И сохраняем новую конфигурацию.

Switch1#copy running-config startup-config

Теперь после перезагрузки коммутатор будет загружать файл с измененным паролем.

apcupsd

Установка apcupsd тривиальна.

yum -y install apcupsd

Включить, выключить, добавить в автозагрузку

systemctl start apcupsd
systemctl stop apcupsd
systemctl enable apcupsd

Конфиг. В случае подключения по usb — можно оставить по умолчанию. Логи

vi /etc/apcupsd/apcupsd.conf

tail -f /etc/apcupsd/apcupsd.events

В результате появилась служба которая поддерживает связь с ИБП и команда

apcaccess status

solaris 10 syslog-ng

Появилась рабочая необходимость собрать логи с ряда сетевых устройств в замкнутой системе. Свой ноут подключить в сеть нельзя. Все компы и сервера в системе на solaris 10 update 10. Так как задачу приходилось решать не один раз — запишу последовательность действий. Чтобы в следующий раз не тупить.

Для начала необходимо убедится что установлены все необходимые пакеты.

SUNWPython (The Python interpreter, libraries and utilities)
SUNWPython-devel (The Python interpreter, libraries and utilities, platform dependent developer files, stored in /usr)
SUNWPython-share (The Python interpreter, libraries and utilities, platform independent shared files, stored in /usr/sfw/share)

проверять командой pkginfo

pkginfo |grep SUNWPython

Если все пакеты присутствуют, следует приступать к установке собственно syslog-ng сервера. Есть два варианта — собирать из исходных кодов, или установить готовый пакет. Я без труда нашел скомпилированный пакет, поэтому буду устанавливать syslogng-1.6.11-sol10-x86-local.

pkgadd -d ./syslogng-1.6.11-sol10-x86-local
mkdir /usr/local/etc
mkdir /usr/local/etc/syslog-ng
cp /usr/local/doc/syslog-ng/doc/syslog-ng.conf.solaris /usr/local/etc/syslog-ng/syslog-ng.con

Далее нужно выключить стандартный syslog сервер соляриса. Затем проверить что он выключен. (возможно впоследствии его потребуется включить)

Выключить
svcadm disable svc:/system/system-log:default
svcadm disable svc:/network/shell:defaul

Проверить
svcs svc:/system/system-log:default
svcs svc:/network/shell:default

Включить
svcadm enable svc:/system/system-log:default
svcadm enable svc:/network/shell:default

Теперь необходимо создать скрипт запуска /lib/svc/method/svc-syslog-ng

vi /lib/svc/method/svc-syslog-ng
#!/bin/sh
. /lib/svc/share/smf_include.sh
Start processes required for syslog-ng
Required for certain libgcc and eventlog libraries
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/sfw/lib
export LD_LIBRARY_PATH
if [ -x /usr/local/sbin/syslog-ng ]; then
/usr/local/sbin/syslog-ng
else
echo "syslog-ng is missing or not executable."
exit $SMF_EXIT_ERR_CONFIG
fi
exit $SMF_EXIT_OK

Задать для него владельца и права.

chown root:bin /lib/svc/method/svc-syslog-ng
chmod 755 /lib/svc/method/svc-syslog-ng

Далее необходимо создать файл SMF манифеста /var/svc/manifest/system/syslog-ng.xml

vi /var/svc/manifest/system/syslog-ng.xml
<create_default_instance enabled='false' />
<single_instance/>
<dependency name='milestone' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/milestone/sysconfig' />
</dependency>
<dependency name='filesystem' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<dependency name='autofs' grouping='optional_all' restart_on='none' type='service'>
<service_fmri value='svc:/system/filesystem/autofs' /> </dependency>
<dependency name='name-services' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/milestone/name-services' />
</dependency>
<dependent name='syslog-ng_single-user' grouping='optional_all' restart_on='none'>
<service_fmri value='svc:/milestone/multi-user' />
</dependent>
<exec_method type='method' name='start' exec='/lib/svc/method/svc-syslog-ng' timeout_seconds='60' />
<exec_method type='method' name='stop' exec=':kill' timeout_seconds='60' />
<exec_method type='method' name='refresh' exec=':kill -HUP' timeout_seconds='60' />
<property_group name='general' type='framework'>
<!-- to start stop syslog daemon -->
<propval name='action_authorization' type='astring' value='solaris.smf.manage.syslog-ng' />
</property_group>
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'> syslog-ng </loctext>
</common_name>
<documentation>
<manpage title='syslog-ng' section='1M' manpath='/usr/share/man' /> </documentation>
</template>

Задать для манифеста владельца и права

chown root:sys /var/svc/manifest/system/syslog-ng.xml
chmod 444 /var/svc/manifest/system/syslog-ng.xml

Далее нужно проверить созданный манифест

svccfg validate /var/svc/manifest/system/syslog-ng.xml

Если ошибок нет — импортировать манифест в SMF

svccfg import /var/svc/manifest/system/syslog-ng.xml

Проверить что сервис появился в SMF базе

svcs syslog-ng

Включить/выключить сервис

svcadm disable syslog-ng
svcadm enable syslog-ng

Если включатся не хочет, вместо online выпадает в статус maintenence — нужно смотреть лог-файл службы

tail /var/svc/log/system-syslog-ng:default.log

Чтобы сконфигурировать сервис нужно редактировать конфиг по адресу /usr/local/etc/syslog-ng.conf Приведу пример примитивного конфига, который слушает 514й порт и записывает все что на него прилетает в файл /var/log/remote/cisco.log

vi /usr/local/etc/syslog-ng.conf

source s_udp { udp (ip ("0.0.0.0") port (514)); };
destination d_cisco { file("/var/log/remote/cisco.log"); };
log { source(s_udp); destination(d_cisco); };

Или чуть сложнее - с фильтром по адресу сети источника
source s_udp { udp (ip ("0.0.0.0") port (514)); };
destination d_cisco { file("/var/log/remote/cisco.log"); };
filter f_cisco { netmask("192.168.55.0/255.255.255.0"); };
log { source(s_udp); filter(f_cisco); destination(d_cisco); };