Intereting Posts
Org-mode: Вставка (продвинутых) уравнений LaTeX для HTML expot Трассировка маршрута символической ссылки Как отправить все выходные данные на пейджер по умолчанию? Вход в сеанс пользователя с chroot Получение AverageReadTime и averageWriteTime в Solaris (дисковый ввод-вывод) Как захватить адрес контакта приложения? Использовать для цикла в find exec perl regex заменяется глобально, если глобальный не выбран Разрешить пользователю подключаться с использованием SSH или SFTP, но ограничить домашний каталог (Centos7) Wacom Linux xsetwacom Прикрепить сценарий оболочки к кнопкам Карта с одним Wi-Fi, одновременное подключение к нескольким точкам доступа Удалить перекрывающиеся диапазоны IP в текстовом файле Как выполнить действие только в первой строке? Проблемы демонирования процесса Java на Debian Какой пользователь (www-data или vagrant) запускает приложение Laravel в виртуальном сервере Homestead?

Запуск сценария локальной оболочки на нескольких удаленных серверах параллельно и получение статуса

Мне нужно запустить локальный скрипт на удаленных серверах. Запуск сценария для параллельного запуска очень важен.

[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt ec2-user@18.218.191.143 ec2-user@18.220.183.27 ec2-user@18.222.199.72 ec2-user@13.58.207.76 ec2-user@18.191.231.120 [ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt | xargs -I {} ssh {} -T 'bash -s' < ./file.sh ssh: Could not resolve hostname #!/bin/sh: Name or service not known xargs: ssh: exited with status 255; aborting [ec2-user@ip-172-31-43-140 ~]$ 

    Мне нравится эта форма при выполнении этого:

     $ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh 

    Или с {} если они вам нужны:

     $ cat hosts.txt | xargs -n1 -P8 -I{} sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh {} 

    пример

    hello.bash

     $ cat hello.bash #!/bin/bash echo "hi from server: $(hostname)" 

    ssh xargs

     $ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh hi from server: mulder.mydom.com hi from server: skinner.mydom.com hi from server: manny.mydom.com 

    Подробности:

    • -n1 -P8 - сообщает xargs нужно принять 1 аргумент и запустить 8 экземпляров ssh
    • sh -c 'ssh -T "$1"
      • это вызывает оболочку, а затем запускает команду после -c "..."
      • обратите внимание, что мы пропускаем здесь $1 , чтобы избежать инъекционных атак.
      • -T отключает псевдо-терминал. $1 - это содержимое файла, в который cat .
    • bash -s < ./hello.bash' - команды, которые будут переданы ssh
    • sh - конечный sh - это то, что передается в xargs в качестве оболочки для вызова, аргумент # 0 ( $0 ).

    Рекомендации

    • rasschaert / xargs-SSH
    • Параллельный запуск программ с использованием xargs
    • Можно ли безопасно использовать `find -exec sh -c`?
    • Передача нескольких параметров через xargs

    hello.bash :

     doit() { echo Define echo what you want done in a echo function } export -f doit 

    Затем сделайте:

     . hello.bash parallel --env doit --slf hosts.txt --tag --nonall doit 

    Да, вы можете сделать это с помощью менеджера систем AWS. Команда запуска AWS Systems Manager позволяет удаленно и безопасно запускать набор команд на EC2, а также на локальном сервере. Ниже приведены шаги высокого уровня для достижения этой цели.

    Роль присоединения IAM экземпляра. Экземпляр ec2 должен иметь роль IAM с политикой AmazonSSMFullAccess. Эта роль позволяет экземпляру взаимодействовать с API-интерфейсом System Manager.

    Установите агент SSM: на экземпляре EC2 должен быть установлен агент SSM. Агент SSM обрабатывает запросы команды запуска и настраивает экземпляр в соответствии с командой.

    Команда «Выполнить»: пример использования через интерфейс командной строки AWS: в --instance-ids приведен список идентификаторов экземпляров ec2. Выполните следующую команду, чтобы получить службы, запущенные на экземпляре. Замените Instance-ID на идентификатор экземпляра ec2.

     aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text 

    Больше информации здесь