[Résolu] Administrer un parc de machines (script, ssh, sudo, ubuntu)

Administrer un parc de machines (script, ssh, sudo, ubuntu) [Résolu] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 14-04-2010 à 11:38:54    

Bonjour,
 
Je souhaite écrire de manière automatisée dans /etc sur un ensemble de machines.
Ces machines tournent sous Ubuntu, le compte root est désactivé donc.
 
Ca commence mal me direz-vous, heureusement je dispose pour chaque système
- d'un compte sudoer local (le même sur toutes les machines).
- d'un serveur ssh (bien qu'aucune clé ssh ne soit encore en place).
 
Question :
Comment déployer un fichier de conf dans le /etc de toutes ses machines, sans laisser traîner de mot de passe en clair dans un script ou sur le résal, sans avoir à prendre la main sur chacun des postes ?
 
Par défaut, sudo ne tolère pas être exécuté à travers ssh, (sudo: no tty present and no askpass program specified), donc là, j'ai l'impression de devoir au minimum refaire la conf de sudo sur chacun des postes.
 
J'espère qu'il y a parmis vous des gens plus rusés que moi, ou ça risque d'être laborieux.


Message édité par thamieu le 15-04-2010 à 15:03:44
Reply

Marsh Posté le 14-04-2010 à 11:38:54   

Reply

Marsh Posté le 14-04-2010 à 12:17:28    

Tu peux regarder du côté de puppet ou cfengine pour le déploiement de fichiers.

Reply

Marsh Posté le 14-04-2010 à 14:55:12    

rdist est fait pour ca ! Et bien sur authentification par clefs ssh ;-)


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 14-04-2010 à 16:06:57    

Merci pour vos réponses.
 
Puppet et cfengine ne répondent pas à mon besoin immédiat : j'ai uniquement besoin de transférer un fichier, ou d'écrire dedans.
Rdist me semble plus approprié, mais ça demande quelques manip' qui me sont justement nécessaire pour écrire dans /etc j'regarde ça.
 
Pour exécuter sudo à travers ssh, j'ai trouvé la solution dans le man.

Citation :

-t      Force pseudo-tty allocation.  This can be used to execute arbi‐
             trary screen-based programs on a remote machine, which can be
             very useful, e.g. when implementing menu services.  Multiple -t
             options force tty allocation, even if ssh has no local tty.


 
Cependant, j'ai un problème avec sudo, sur les machines distantes :

Code :
  1. $ sudo -i echo server=$ip > /etc/ocsinventory/ocsinventory-agent.cfg
  2. -bash: /etc/ocsinventory/ocsinventory-agent.cfg: Permission non accordée


 
En revanche, si je décompose la commande en plusieurs étapes, cela fonctionne :

Code :
  1. $ sudo -i
  2. root@ubuntu-karmic:~# echo server=$ip > /etc/ocsinventory/ocsinventory-agent.cfg
  3. root@ubuntu-karmic:~# cat /etc/ocsinventory/ocsinventory-agent.cfg
  4. server=$ip


 
Le problème c'est qu'en scriptant avec ssh, la décomposition ne fonctionne pas, un terminal s'ouvre et ni le echo ni le exit n'ont lieu  :

Code :
  1. $ ssh -t remoteusr@ubuntu-karmic "sudo -i; echo server=$ip > /etc/ocsinventory/ocsinventory-agent.cfg; exit"
  2. remoteusr@ubuntu-karmic's password:
  3. Password:
  4. root@ubuntu-karmic:~#


 
Pourtant, la syntaxe me semble correcte et le man me confirme que sudo devrait accepter une commande directement après le -i.

Citation :

The -i (simulate initial login) option runs the shell
                   specified in the passwd(5) entry of the target user as a
                   login shell.  This means that login-specific resource files
                   such as .profile or .login will be read by the shell.  If a
                   command is specified, it is passed to the shell for
                   execution.  Otherwise, an interactive shell is executed.


Une idée pour indiquer l'adresse du serveur ocs à mes agents déjà installés mais jamais configurés ?


Message édité par thamieu le 14-04-2010 à 16:10:47
Reply

Marsh Posté le 14-04-2010 à 16:10:24    

utilise fabric : http://docs.fabfile.org/0.9.0/
 
ça a été conçu pour ça (et plus encore)


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 14-04-2010 à 17:49:59    

En uploadant un script bash, et en le faisant exécuter ça ne marche pas ? :o


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 14-04-2010 à 19:05:28    

bardiel a écrit :

En uploadant un script bash, et en le faisant exécuter ça ne marche pas ? :o


 [:malicia]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 15-04-2010 à 09:58:14    

Si vous avez le moyen de passer le mot de passe à sudo sans qu'il n'apparaisse en clair, je prends :o

Reply

Marsh Posté le 15-04-2010 à 10:06:47    

thamieu a écrit :

Si vous avez le moyen de passer le mot de passe à sudo sans qu'il n'apparaisse en clair, je prends :o


 
utilise fabric :spamafote:


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 15-04-2010 à 10:10:43    

black_lord a écrit :

utilise fabric :spamafote:


Tu commences à radoter :o

Spoiler :

oui, y a une raison, je sais [:whatde]


---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 15-04-2010 à 10:10:43   

Reply

Marsh Posté le 15-04-2010 à 11:12:58    

o'gure a écrit :


Tu commences à radoter :o

Spoiler :

oui, y a une raison, je sais [:whatde]



 
ça va encore m'agacer  [:bakk43]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 15-04-2010 à 12:12:30    


et scp, connais pas ? :pfff:  
en ayant déjà les clés des machines distantes ou encore mieux si dès le départ on a une authentification à clé publique, on peut très bien scripter l'envoi d'un script ( :pt1cable: ), même si pour faire "propre" il faudrait plutôt taper x fois la commande :

scp monscript.sh machinedist_x:/etc/ocsinventory/ocsinventory-agent.cfg


 
après j'ai bien vu ça, mais bon impose l'installation d'expect et le mot de passe en clair dans le script :/


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 15-04-2010 à 13:15:25    

bardiel a écrit :

on peut très bien scripter l'envoi d'un script ( :pt1cable: ), même si pour faire "propre" il faudrait plutôt taper x fois la commande :

scp monscript.sh machinedist_x:/etc/ocsinventory/ocsinventory-agent.cfg



On peut effectivement réinventer la roue sans arrêt et refuser d'utiliser les beaux packages déjà prêt :

Citation :

Package: fabric
Priority: optional
Section: net
Installed-Size: 132
Maintainer: Chris Lamb <lamby@debian.org>
Architecture: all
Version: 0.9.0-2
Depends: python (>= 2.5), python-support (>= 0.90.0), python-paramiko (>= 1.6), python-pkg-resources
Filename: pool/main/f/fabric/fabric_0.9.0-2_all.deb
Size: 35990
MD5sum: c31c63674b732a8b4f12a1699b504312
SHA1: dc86fbb98c87850c1f7b30b1cb06e415ec776d17
SHA256: ea96988e1973c893e4bb7a14f4ba8bacdb8a7b13435baa50b3ee36cfd5d85d90
Description: Simple Pythonic remote deployment tool
 Fabric is designed to upload files and run shell commands on a number of
 servers in parallel or serially. These commands are grouped in tasks (which
 are regular Python functions) and specified in a 'fabfile.'
 .
 It is similar to Capistrano, except it's implemented in Python and doesn't
 expect you to be deploying Rails applications.
Homepage: http://fabfile.org/


---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 15-04-2010 à 13:41:26    

oui t'as raison, pourquoi installer un logiciel (fabric) ainsi qu'un environnement (python, même si installé par défaut sur Ubuntu, peut ne pas l'être...), pour faire ce que l'on a déjà (scp) :o


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 15-04-2010 à 13:58:19    

bardiel a écrit :


et scp, connais pas ? :pfff:
en ayant déjà les clés des machines distantes ou encore mieux si dès le départ on a une authentification à clé publique, on peut très bien scripter l'envoi d'un script ( :pt1cable: ), même si pour faire "propre" il faudrait plutôt taper x fois la commande :

scp monscript.sh machinedist_x:/etc/ocsinventory/ocsinventory-agent.cfg

 

après j'ai bien vu ça, mais bon impose l'installation d'expect et le mot de passe en clair dans le script :/

 
bardiel a écrit :

oui t'as raison, pourquoi installer un logiciel (fabric) ainsi qu'un environnement (python, même si installé par défaut sur Ubuntu, peut ne pas l'être...), pour faire ce que l'on a déjà (scp) :o

 

bah ouais, j'y connais rien, c'est pas mon taff et j'y connais que dalle en unix [:cosmoschtroumpf] d'ailleurs 132k à installer c'est vraiment trop lourd pour gagner des heures de boulot  [:pingouino] en plus ça utilise SSH & le sftp. Vindiou, faudrait revenir à telnet & rcp  [:tomatookc] avant on savait vivre  [:_xxx_]

 

Et puis expect c'est tellllllleement naturel à utiliser [:klem3i1]

 

Bref, des mecs comme toi ça lancerait des fusées avec des élastiques...  [:seblomb:1]

Message cité 2 fois
Message édité par black_lord le 15-04-2010 à 13:58:45

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 15-04-2010 à 14:04:32    

bardiel a écrit :

pour faire ce que l'on a déjà (scp) :o


Pour le faire simplement et se faciliter le dévelopement/déploiement. Ca me semble suffir comme raison.
Ton script tu vas bien devoir te le coltiner pour gérer l'ensemble des machines et la gestion des privilèges. Autant se servir de primitives éprouvées au lieu de perdre du temps à réinventer un moteur entier.

Message cité 1 fois
Message édité par o'gure le 15-04-2010 à 14:05:00

---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 15-04-2010 à 15:02:09    

bardiel a écrit :


et scp, connais pas ? :pfff:  
en ayant déjà les clés des machines distantes ou encore mieux si dès le départ on a une authentification à clé publique, on peut très bien scripter l'envoi d'un script ( :pt1cable: ), même si pour faire "propre" il faudrait plutôt taper x fois la commande :

scp monscript.sh machinedist_x:/etc/ocsinventory/ocsinventory-agent.cfg


 
après j'ai bien vu ça, mais bon impose l'installation d'expect et le mot de passe en clair dans le script :/


 

black_lord a écrit :


 
 
 
bah ouais, j'y connais rien, c'est pas mon taff et j'y connais que dalle en unix [:cosmoschtroumpf] d'ailleurs 132k à installer c'est vraiment trop lourd pour gagner des heures de boulot  [:pingouino] en plus ça utilise SSH & le sftp. Vindiou, faudrait revenir à telnet & rcp  [:tomatookc] avant on savait vivre  [:_xxx_]  
 
Et puis expect c'est tellllllleement naturel à utiliser [:klem3i1]
 
Bref, des mecs comme toi ça lancerait des fusées avec des élastiques...  [:seblomb:1]

Pendant un instant j'ai cru que 132k c'était ton salaire :sweat:  
 

o'gure a écrit :


Pour le faire simplement et se faciliter le dévelopement/déploiement. Ca me semble suffir comme raison.
Ton script tu vas bien devoir te le coltiner pour gérer l'ensemble des machines et la gestion des privilèges. Autant se servir de primitives éprouvées au lieu de perdre du temps à réinventer un moteur entier.

Moi qui n'ai fait qu'un peu de bash, il me paraissait aussi plus pratique de résoudre ça à coups de ssh/scp et expect.
J'aurai mis le temps, mais ce fabric m'a l'air d'être un outil très très pratique. Par contre le coup du env.user est très sioux :/
 
Voilà donc comment écrire mon fichu fichier dans /etc :
 
Installation de fabric (la version des dépôts ubuntu est très ancienne)

Citation :


# apt-get install python-setuptools
# easy_install -U fabric


 
Ecriture du script fabfile.py

Citation :


from fabric.api import env, sudo
 
env.hosts = ['user@host']
 
def ocsagent():
    sudo("echo server=255.255.255.255 > /etc/ocsinventory/ocsinventory-agent.cfg" )


 
Exécution

Citation :


$ /usr/local/bin/fab ocsagent


 
J'avais brièvement essayé rdist mais il me semble qu'il ne gérait pas sudo comme je le voulais.
En tout cas merci pour vos réponses qui en plus de m'aider à me dépatouiller me font découvrir des outils qui risquent fort de me faciliter la tâche plus d'une fois.

Reply

Marsh Posté le 15-04-2010 à 17:06:07    

petite question quand même :D : c'était (c'est) pour combien de machines clientes ? (que la prochaine fois que je/on vois la question, je/on penche aussi pour une solution identique si plus de x machines)
 
au passage, pour l'exécution c'est bien fabfile ocsagent et pas fab ocsagent ? :pt1cable:  
 
et merci pour le code pour les suivants :sol:  
 
@black_lord : telnet, c'était mieux avant [:plusun] (copyrithé ? :whistle: )
et expect, oui c'est naturel :D (comment ça t'as pas 10 interpréteurs sur ta machine Linux ? :sweat: )

Citation :

Bref, des mecs comme toi ça lancerait des fusées avec des élastiques...


oui, avec des modèles très gros format [:bakk20]  

Spoiler :

chuis pu là [:tang]


 
je proposais surtout l'utilisation de scp car :
1- (quasi-) universelle, que l'on est un client ubuntu, un serveur Debian (encore heureux :whistle: ), une SuSE (et pas Suze), une Gentoo (ou un Sabayon), etc...
2- scriptable (oui bon, je reconnais faut le vouloir :bounce: )
je pense qu'il vaut mieux un tournevis (et le format de vis) disponible partout qu'une vis made in Machin utilisable avec un tournevis uniquement de la marque Bidule®™, enfin bon après on va pas polémiquer dessus, chacun fait comme il l'entend :o (et heureusement d'ailleurs)


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 16-04-2010 à 11:40:37    

Nombre de machines  encore indéterminé. Testé avec une.
J'vais bientôt voir comment ça se passe pour déclarer un identifiant commun à une liste de machines, sans avoir à ajouter un user@ devant chaque adresse.
 
Pour l'exécution c'est fab ocsagent, où ocsagent est le nom d'une fonction qui se trouve dans un fichier fabfile.py.
 
Et puis fabric ça me semble aussi universel que scp.

Reply

Marsh Posté le 16-04-2010 à 12:06:43    

thamieu a écrit :

Nombre de machines  encore indéterminé. Testé avec une.
J'vais bientôt voir comment ça se passe pour déclarer un identifiant commun à une liste de machines, sans avoir à ajouter un user@ devant chaque adresse.
 
Pour l'exécution c'est fab ocsagent, où ocsagent est le nom d'une fonction qui se trouve dans un fichier fabfile.py.
 
Et puis fabric ça me semble aussi universel que scp.


 
tu settes le user dans ton fabfile.py
 
et fabric utilise scp (et ssh) via paramiko


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 21-04-2010 à 09:29:43    

black_lord a écrit :


 
tu settes le user dans ton fabfile.py
 
et fabric utilise scp (et ssh) via paramiko


Si je définis les variables ainsi, j'obtiens une erreur :

Citation :


env.user = ['user']
env.hosts = ['host1', 'host2']


Citation :


$ fab ocsagent
[frecb002633] sudo: echo server=freeserv2 > /etc/ocsinventory/ocsinventory-agent.cfg
Password for ['user']@host1:  
No handlers could be found for logger "paramiko.transport"


 
Il me faut définir explicitement l'utilisateur pour chaque machine, de cette manière :

Citation :


env.user = ['user']
env.hosts = ['user@host1', 'user@host2']


 
Ce n'est pas très confortable. Je préfèrerais mettre la liste des machines dans un fichier séparé, en ne définissant l'utilisateur qu'une seule fois.
Une idée ?

Reply

Marsh Posté le 21-04-2010 à 17:43:51    

oczinventory/glpi ?

Reply

Marsh Posté le 21-04-2010 à 19:24:33    

gug42 a écrit :

oczinventory/glpi ?


hmm, toi/lire messages précédents ?

 

le but de thamieu est justement d'uploader sur ses clients un fichiers de configuration pour OCS justement... à défaut d'une GPO (merci aux programmeurs de Microsoft de cette géniale invention), thamieu est obligé de scripter un fichier d'upload.

 

par contre même ainsi je pense qu'à chaque fois ton script va te demander le mot de passe pour chaque machine sur lequel le script agit. tu veux un gros élastique pour lancer ta fusée ? :D

Message cité 1 fois
Message édité par bardiel le 21-04-2010 à 19:24:52

---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 21-04-2010 à 21:58:29    

bardiel a écrit :


hmm, toi/lire messages précédents ?
 
le but de thamieu est justement d'uploader sur ses clients un fichiers de configuration pour OCS justement...à défaut d'une GPO (merci aux programmeurs de Microsoft de cette géniale invention), thamieu est obligé de scripter un fichier d'upload.


Toutafé. Mais comme mes machines ne sont intégrées à aucun annuaire, c'est pas des GPO qui m'aideront :o

bardiel a écrit :


par contre même ainsi je pense qu'à chaque fois ton script va te demander le mot de passe pour chaque machine sur lequel le script agit. tu veux un gros élastique pour lancer ta fusée ? :D

Nan, la solution de black lord est très efficace, elle demande le mot de passe pour le compte local de la 1ère machine et fournit le même mot de passe aux comptes locaux (du même nom) des machines suivantes.
 
Là c'que j'veux c'est
- utiliser la variable env.user sans me ramasser un message d'erreur imbitable
- utiliser une liste de machine plutôt que spécifier chaque nom entre apostrophes
 
J'pense qu'après j'aurai plus besoin d'élastique.

Reply

Marsh Posté le 21-04-2010 à 22:23:42    

thamieu a écrit :

Nan, la solution de black lord est très efficace,


 
évidemment  [:julm3]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 24-04-2010 à 12:18:20    

black_lord a écrit :


 
bah ouais, j'y connais rien, c'est pas mon taff et j'y connais que dalle en unix [:cosmoschtroumpf] d'ailleurs 132k à installer c'est vraiment trop lourd pour gagner des heures de boulot  [:pingouino] en plus ça utilise SSH & le sftp. Vindiou, faudrait revenir à telnet & rcp  [:tomatookc] avant on savait vivre  [:_xxx_]  
 
Et puis expect c'est tellllllleement naturel à utiliser [:klem3i1]
 
Bref, des mecs comme toi ça lancerait des fusées avec des élastiques...  [:seblomb:1]


 
PQ


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
Reply

Marsh Posté le 24-04-2010 à 12:19:01    

black_lord a écrit :


 
évidemment  [:julm3]


et la modestie [:whatde]


---------------
En théorie, la théorie et la pratique sont identiques, en pratique, non.
Reply

Marsh Posté le 13-07-2010 à 10:33:41    

je up, même si c'est résolu, désolé, j'ai un besoin similaire avec une trentaine de machine, fabric a l'air de faire ce dont j'ai besoin mais ya un truc qui me chiffonne c'est que j'aimerais que la maintenance puisse se faire de façon non synchro: je m'explique:

 

Si au moment où je lance fabric, ya que 32 machines sur 35 qui sont allumées. je voudrais que les opérations soient effectuées sur ces 32 machines et que l'opération soit reportée automatiquement sur les autres machines

 

Mieux encore, je voudrais pouvoir gérer une liste d'opération qui puissent être exécutées à la suite si j'installe un nouveau poste par exemple ou ignorées si déjà effectuées

 

A priori, je devrais pouvoir gérer ça avec du code Python et un crontab mais je me demandais si ça existait pas en natif :p


Message édité par trueslash le 13-07-2010 à 10:34:20
Reply

Marsh Posté le 13-07-2010 à 10:37:19    

ça n'existe pas en natif mais y'a des palliatifs.


Message édité par black_lord le 13-07-2010 à 10:37:35

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 13-07-2010 à 10:45:48    

nickel, je vais pouvoir jouer avec ça ce week-end :)

 

Merci


Message édité par trueslash le 13-07-2010 à 10:46:05
Reply

Marsh Posté le 22-07-2010 à 05:26:39    

bon petite update, ça se passe plutôt pas mal pour moi, ya un truc qui me chiffone c'est le fait de ne pas pouvoir exécuterles commandes sur plusieurs machines en parallèle mais a priori, c'est en cours de dev: http://code.fabfile.org/issues/show/19#change-664
 
J'ai une tache qui prend entre une et deux heures à la louche donc je peux pas vraiment la faire tourner de façon séquentielle, enfin je vais voir si je peux pas le faire en tâche de fond.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed