Bash: Comment copier un fichier sur plusieurs serveurs SSH, qui sont tous spécifiés dans un fichier texte de liste?

1

J'ai un fichier (disons "thisfile.sh" par exemple) que je voudrais copier sur plusieurs serveurs (dont certains peuvent nécessiter une authentification par mot de passe) à la fois lors du lancement de mon fichier bash, présumé avec SCP. Toutes les adresses de serveur sont écrites ligne par ligne dans un document texte. Disons que le fichier s'appelle "ServerList", par exemple:

firstuser@server.com
seconduser@anotherserver.com
anotheruser@newserver.com
[...]

Comment puis-je atteindre cet objectif?

Edit: J'ai pensé à cela un peu plus, et j'aimerais quand même terminer avec bash en entrée, j'utiliserai une alternative un peu plus tard. J'imagine que je pourrais le faire en utilisant la commande de copie SCP et une variable à la place de ma destination, un petit quelque chose comme ce scp myfile $ Server: ~ / myfile . De cette façon, je suis à peu près sûr que je devrai utiliser une boucle de quelque sorte, afin que toutes les lignes soient copiées au fur et à mesure que je les copie.

utilisateur3125996
la source
Voulez-vous écrire les mots de passe manuellement? Le répertoire de destin est-il toujours le même?
Hewbot
Pour l'instant, comme je n'utilise que ce que je programme maintenant comme base, je serais bien d'accord pour qu'il s'arrête pour demander le mot de passe une fois qu'il rencontre un serveur protégé par mot de passe.
user3125996

Réponses:

3

Si vous voulez rester dans le domaine réservé à bash:

while read server
    scp thisfile.sh $server:/some/location
    ssh $server /some/location/thisfile.sh
done < servers.txt

Ceci vous invitera à exécuter un travail à la fois et vous demandera une authentification si nécessaire

Felipe Lema
la source
Je viens de supprimer ma réponse car la vôtre est la même mais plus complète;)
Hewbot
0

Vous pouvez y parvenir de plusieurs façons. Vous pouvez utiliser quelque chose comme ansible ou fabric pour écrire un script qui se connecte à tous vos ordinateurs, leur copie le fichier et exécute le script. ou vous pouvez écrire un script bash / shell pour copier les fichiers puis exécuter le script.

Fabric et Ansible ont une courbe d’apprentissage légèrement plus longue, mais peuvent être plus utiles et ajouter facilement plus d’ordinateur ou modifier le script.

Le script bash ou shell sera plus facile à écrire mais un peu plus difficile à adapter si vous en avez besoin à l'avenir.

https://www.digitalocean.com/community/tutorials/how-to-use-fabric-to-automate-administration-tasks-and-deployments - Fabric

http://docs.ansible.com/ansible/intro_getting_started.html - Ansible

Voici les guides pour ansible et tissu

grag42
la source
0

Alors que Felipe a la meilleure réponse pour une solution uniquement bash, je pense qu'Ansible est de loin supérieur à cette tâche.

Vous devez simplement mettre tous vos serveurs dans un fichier d'inventaire comme ceci:

[default]
firstserver.com     ansible_ssh_user=firstuser
secondserver.com    ansible_ssh_user=seconduser
thirdserver.com     ansible_ssh_user=thirduser

Et un livre de jeu qui ressemble à ceci:

--- #copyfiles.yml
hosts: all
tasks:
- name: copy file to servers
  copy:
    src: /path/to/local/file
    dest: /path/to/remote/file

Et puis courez:

ansible-playbook -i /path/to/inventory copyfiles.yml --ask-pass
MillerGeek
la source