Notre structure logique de serveur est basée sur le concept de "cluster" et "instance". Un cluster est un ensemble d'instances de Weblogic et/ou de Karaf et/ou d'Apache et/ou de Nginx et/ou de Jboss. Les instances "MAI OU PEUT-ÊTRE" peuvent être réparties sur plusieurs hôtes.Est-il possible de créer/appeler plusieurs instances de AnsibleModule à l'intérieur d'un module?
Un groupe classique serait: hôtes: a, b instances sur: tst13-apache, tst13-weblogic-ECOM, tst13-weblogic-remplir instances sur b: tst13-karaf repos bus, tst13 -karf-rest-svcs, tst13-nginx-cache
J'ai créé un module de super-classe (myMod) et 5 sous-classes (myApache, myNginx, myJboss, myKaraf, myWeblogic). Les informations "instance" (variables d'inventaire) sont conservées dans une base de données ldap. Les instances ne sont pas "enregistrées" dans les répertoires rc.d sur les hôtes. Chaque serveur a des "scripts génériques" pour démarrer une instance apache et une instance weblogic et une instance JBoss et ... par "nom d'instance" donc appeler des modules Ansible tels que "httpd" n'était pas pratique. Mon module sera utilisé pour "stop, start, status, kill, etc" (actions) sur une liste d'instances. Idéalement, je voudrais créer une connexion SSH à l'hôte de destination pour CHAQUE instance de logiciel à actionner sur l'hôte de destination (ce qui, je crois, signifierait une instance d'un module par instance de serveur ...). logiciel qui nécessite une action); cependant, jusqu'à présent, il semble que l'on puisse faire 1 connexion ssh par destination "hôte". Comme un «hôte» peut exécuter plusieurs instances de différents types de logiciels (2 instances apache, 4 instances weblogic et 3 instances karaf peuvent toutes être sur 1 hôte); il semblait pratique de créer mon « myMod » comme suit:
#####
## <ANSIBLE_HOME>/modules/controller.py
#####
import socket
from ansible.module_utils.ldapData import ldapData
from ansible.module_utils.myMod import myMod
from ansible.module_utils.myModules import myApache, myNginx, myWeblogic, myKaraf, myJboss
def main():
arg_spec = dict(
action = dict(default='status', choices=['start', 'stop', 'kill', 'status', 'warm', 'startsession', 'stopsession']),
instances = dict(default='@', required=False, type='str'),
)
host = socket.gethostname()
serverdata = ldapData()
cluster = serverdata.hosts[host]["cluster"]
clusterData = serverdata.clusters[cluster]
hostData = serverdata.hosts[host]
classList = list(myMod.__subclasses__())
for classType in classList:
localMod = classType(arg_spec, hostData, clusterData)
localMod.process()
if __name__ == '__main__':
main()
La méthode de processus myMod ressemble à ceci:
#####
## <ANSIBLE_HOME>/module_utils/myMod.py
#####
def process(self):
fPointers = {
'start': self.start,
'stop': self.stop,
'kill': self.kill,
'status': self.status,
'stopsession': self.stopsession,
'startsesson': self.startsession,
'warm': self.warm
}
act = self.params['action']
for inst in self.instances:
if fPointers[act]:
fPointers[act](inst)
else:
undefined(inst)
self.exit_json(changed=self.changed, msg=self.out, warnings=self.warn, errors=self.err)
Actuellement, je ne suis en revenir le « out » et « warn » et "err" du premier module qui appelle "process". Les autres modules ne sont pas exécutés ou ne sont pas signalés. Je m'attends à ce que exit_json soit "en train de quitter la totalité de Ansible" et pas seulement "le module en cours".
Ai-je raison? Y a-t-il un concept en jeu dont je ne suis pas au courant? Quel est le meilleur changement ici pour s'assurer que le "rapport" à la fin de la course montre "toutes les sorties de toutes les instances"?
Merci Konstantin, je suis d'accord. Il y a 2 approches possibles. 1) faire un module avec les assistants qui sont rassemblés à STDOUT comme recommandé et 2) Séparer les assistants dans leurs propres modules (en copiant essentiellement le contenu de ctl.py sur la fin de chaque classe d'aide et en déplaçant les classes auxiliaires dans le répertoire modules au lieu de les avoir tous dans module_utils.Je vais essayer les deux et passer en revue avec les utilisateurs. – nverkland