Je cherche un moyen de transférer la configuration d'une machine centrale à plusieurs machines distantes sans avoir à installer quoi que ce soit sur les machines distantes.
L'objectif est de faire quelque chose comme vous le feriez avec des outils tels que cfengine
, mais sur un ensemble de machines sur lesquelles aucun agent n'est configuré. Cela pourrait en fait être une bonne technique d'installation cfagent
sur un ensemble de machines distantes existantes.
ssh
configuration
bash
scripting
Trémoloqui
la source
la source
Réponses:
Vous pouvez transmettre un script et le faire exécuter de manière éphémère en le connectant puis en exécutant un shell.
par exemple
Naturellement, la
"ls -l; echo 'Hello World'"
pièce pourrait être remplacée par un script bash stocké dans un fichier sur la machine locale.par exemple
À votre santé!
la source
Il y a plusieurs façons de le faire.
1:
2:
3:
le numéro 3 est ma manière préférée, il permet des commandes interactives, par exemple
su -S service nginx restart
(# 1 utilisera le reste du script comme entrée pour la question du mot de passe lorsque vous l'utiliserez
su -S
.)la source
Je recommanderais Fabric en python à cette fin:
Vous devriez pouvoir utiliser ce qui précède pour commencer. Consultez l'excellente documentation de Fabric pour faire le reste. En tant qu’additif, il est tout à fait possible d’écrire votre script entièrement dans Fabric - aucune copie n’est nécessaire, mais il convient de noter que pour modifier le script sur toutes les machines, il vous suffit de modifier la copie locale et de le redéployer. En outre, avec un peu plus que l’utilisation de base de l’API, vous pouvez modifier le script en fonction de l’hôte sur lequel il est actuellement exécuté et / ou d’autres variables. C'est une sorte d'Expect pythonique.
la source
run
etsudo
), n'est même pas nécessaire.C'est exactement ce à quoi Ansible est utilisé. Il n'y a pas d'agent, il suffit de créer un fichier texte appelé:
avec un contenu qui ressemble à quelque chose comme:
Cela spécifierait que les machines "web1, web2 ... web8" sont dans le groupe "hôtes Web". Ensuite, vous pouvez faire des choses comme:
pour redémarrer le service apache2 sur toutes vos machines, en utilisant sudo.
Vous pouvez faire des commandes à la volée comme:
ou vous pouvez exécuter un script local sur la machine distante:
ou vous pouvez créer un playbook (consultez la documentation pour plus de détails) avec une configuration complète à laquelle vos serveurs doivent se conformer et le déployer avec:
En gros, vous pouvez commencer à l'utiliser comme un outil de ligne de commande pour exécuter des commandes sur plusieurs serveurs et à étendre son utilisation en un outil de configuration complet à votre guise.
la source
ansible webhosts -m script script.sh
Comme expliqué dans cette réponse, vous pouvez utiliser heredoc :
Vous devez faire attention avec heredoc, car il envoie simplement du texte, mais il n'attend pas vraiment la réponse. Cela signifie qu'il n'attendra pas que vos commandes soient exécutées.
la source
La réponse ici ( https://stackoverflow.com/a/2732991/4752883 ) fonctionne très bien si vous essayez d'exécuter un script sur une machine Linux distante à l'aide de
plink
oussh
. Cela fonctionnera si le script a plusieurs ligneslinux
.** Cependant, si vous essayez d’exécuter un script de traitement par lots situé sur une
linux/windows
machine locale et que votre machine distante l’estWindows
, elle se compose de plusieurs lignes utilisant **plink root@MachineB -m local_script.bat
ça ne marchera pas.
Seule la première ligne du script sera exécutée. C'est probablement une limitation de
plink
.Solution 1:
Pour exécuter un script de commandes multiligne (en particulier s'il est relativement simple et composé de quelques lignes):
Si votre script de lot d'origine est comme suit
vous pouvez combiner les lignes en utilisant le séparateur "&&" comme suit dans votre
local_script.bat
fichier comme suit : https://stackoverflow.com/a/8055390/4752883 :Après cette modification, vous pouvez ensuite exécuter le script comme indiqué ici par @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883
Solution 2:
Si votre script de traitement par lots est relativement compliqué, il peut être préférable d’utiliser un script de traitement par lots qui encapsule la commande plink ainsi que suit, comme indiqué ici par @Martin https://stackoverflow.com/a/32196999/4752883 :
la source
Pourquoi ne pas simplement copier le script d'abord, puis l'exécuter?
Bien sûr, vous devez faire attention à ne pas le télécharger dans un endroit accessible en écriture, afin que personne d'autre ne puisse le tripoter avant de l'exécuter (éventuellement en tant que root).
la source
Réécrire le script d'une manière que chaque commande déjà est préfixé avec ssh et un nom d' hôte / IP ou une liste de tels est passé au script comme argument ( en supposant que vous avez passwordless / authentification clé ssh-agent mis en place). Certains travaux peuvent être nécessaires pour transmettre correctement les codes d’erreur / retour à partir des commandes à distance ....
la source
Si le script n'est pas trop gros et que vous utilisez bash ou ksh ...
Stdin et stdout fonctionnent correctement, mais le script est limité à la taille de l'argument (généralement environ 100 Ko). Les arguments du script peuvent fonctionner à la fin de la ligne, éventuellement en suivant un argument "-" supplémentaire. Le "-t" pour allouer un pty est optionnel.
Méfiez-vous: cela confond la finalisation de bash, ne touchez pas l'onglet.
la source