créer un fichier sous un répertoire sur plusieurs machines via un script?

Je dois créer un fichier functon.txt sous un répertoire particulier avec hello world dans beaucoup de machine. C’est ce que je faisais jusqu’ici manuellement un par un en se connectant à chaque boîte et en créant le fichier. Ce répertoire est propre à root et je dois donc m’assurer que le nouveau fichier appartient également à l’utilisateur root .

 david@machineA:~$ sudo su [sudo] password for david: root@machineA:/home/david# cd /opt/Potle/ouyt/wert/1 root@machineA:/opt/Potle/ouyt/wert/1# vi functon.txt root@machineA:/opt/Potle/ouyt/wert/1# ssh david@machineB david@machineB:~$ sudo su [sudo] password for david: root@machineB:/home/david# cd /opt/Potle/ouyt/wert/1 root@machineB:/opt/Potle/ouyt/wert/1# vi functon.txt root@machineB:/opt/Potle/ouyt/wert/1# ssh david@machineC ..... 

Maintenant, je dois le faire dans environ 200 machines. Y a-t-il un moyen de faire ces choses via un script? Je vais bien taper des mots de passe plusieurs fois si je le dois mais je ne veux pas me connecter manuellement à ces boîtes et faire toutes les autres étapes à la main.

J’ai un fichier hosts.txt qui contient chaque machine ligne par ligne. Je peux lire ce fichier ligne par ligne et faire les choses ci-dessus, mais je ne sais pas comment?

Ce n’est qu’un exercice pour moi, donc tout ce qui est simple ou facile devrait convenir. Je peux même coder en dur mon mot de passe dans le script pour faire ce travail. Quelle est la meilleure façon d’accomplir cette tâche?

Après avoir installé Ansible:

 ansible -i /path/to/hosts.txt -m ping -u david --ask-pass all 

Voir si vous pouvez cingler les machines avec succès. Si cela réussit, essayez ce qui suit avec 2 machines (créez un autre fichier txt avec seulement 2 machines et transmettez-le à l’option -i ). Ensuite, vous pouvez l’exécuter pour toutes les machines. Si le répertoire n’existe pas, la commande échouera et vous verrez les ordinateurs défaillants en résumé.

 ansible -i /path/to/hosts.txt -m copy -a "src=/path/to/functon.txt dest=/opt/Potle/ouyt/wert/1/functon.txt" -u david --ask-pass --become --become-user root --ask-become-pass all 

Je n’ai pas testé cela. Donc, soyez prudent.

  • -i : hôte (s) d’entrée
  • -m : module
  • -a : arguments du module
  • -u : utilisateur
  • --ask-pass : demande le mot de passe de l’utilisateur
  • – devenir: devenir un autre utilisateur
  • --become-user : nouvel utilisateur
  • --ask-become-pass : demande le mot de passe de l’utilisateur

Vous pouvez vous expect à automatiser la connexion SSH par copie / SSH:

 #!/usr/bin/expect set password [lindex $argv 1] spawn scp -P 22 [lindex $argv 2] [lindex $argv 0] expect "*password:*" send -- "$password\r" send -- "\r" expect eof 

La commande expect attendra la réception de la chaîne que vous fournissez en arguments.

Vous pouvez parcourir vos hôtes à partir de hosts.txt et exécuter ce script pour chacun d’eux:

 ./create_config.sh david@machineA:/opt/Potle/ouyt/wert/1/ somePassword functon.txt 

Si vous n’avez pas la possibilité de faire de la copie SSH mais seulement de SSH, vous pouvez toujours envoyer la commande avec expect:

 #!/usr/bin/expect set password [lindex $argv 1] spawn ssh -p 22 [lindex $argv 0] expect "*password:*" send -- "$password\r" send -- "\r" # expect the command prompt : change this if needed expect "*$*" # execute some commands send -- "echo 'some text to write to some file' > ~/some_file.txt\r" # exit vm send -- "exit\r" expect eof 

Vous pouvez lancer ceci avec:

 ./create_config.sh david@machineA somePassword 

Vous pouvez utiliser sshfs: monter une machine, faire ce que vous voulez, démonter et passer à la suivante.