web-dev-qa-db-fra.com

Ansible - Puis-je imprimer des informations pendant l'exécution du module?

J'aimerais savoir s'il existe un moyen d'imprimer des informations pendant l'exécution d'un module, principalement pour démontrer que le processus fonctionne et qu'il n'a pas été suspendu. Plus précisément, j'essaie d'obtenir des informations en retour lors de l'exécution du module cloudformation . J'ai essayé de modifier le code source (Python) pour inclure les éléments suivants:

def debug(msg):
   print json.dumps({
      "DEBUG" : msg
   })

...

debug("The stack operation is still working...")

Bien sûr, cela stockait toute cette sortie et ne l’imprimait que lorsque le module avait fini de s’exécuter. Ainsi, pour les modèles cloudformation particulièrement volumineux, cela signifie que j’attends environ 5 minutes, puis que je vois soudainement une grande quantité de texte apparaître à l’écran à la fin. Ce à quoi je m'attendais était de voir "La pile fonctionne toujours ..." toutes les x secondes.

Il semblerait que les Actions et interrogations asynchrones soient ce que je recherche ... mais cela n’a pas fonctionné non plus. La tâche entière, "Lancer CloudFormation pour {{stackname}}", a été entièrement ignorée. Voir ci-dessous l'extrait pertinent (YAML) de mon livre de jeu:

- name: Launch CloudFormation for {{ stackname }}
      cloudformation: >
       stack_name="{{ stackname }}" state=present
       region="{{ region }}" disable_rollback=true
       template="{{ template }}"
      register: cloud
      args:
        template_parameters:
          KeyName: "{{ keyName }}"
          Region: "{{ region }}"
          SecurityGroup: "{{ securityGroup }}"
          BootStrapper: "{{ bootStrapper }}"
          BootStrapCommand: "powershell.exe -executionpolicy unrestricted -File C:\\{{ bootStrapper }} {{ region }}"
          S3Bucket: "{{ s3Bucket }}"
      async: 3600
      poll: 30

Cela me dit que async est destiné à des commandes Shell typiques, et non à des modules complexes tels que cloudformation.OU- J'ai peut-être mal agi.

Quelqu'un pourrait-il faire la lumière sur cette situation? Encore une fois, pour les tâches cloudformation volumineuses qui prennent un certain temps, j'aimerais avoir une indication périodique indiquant que la tâche est toujours en cours d'exécution et non suspendue. J'apprécie l'aide!

16
Brian

La réponse est simple: non. Ansible est un système continu qui vise à gérer la capacité de fonctionner sur un ensemble de serveurs et l'affichage de résultats stdout en temps réel peut s'avérer très peu pratique.

Mais je pense que vous pouvez utiliser certaines astuces si votre système de destination peut prendre en charge l'exécution en arrière-plan. Je vois que votre système est Windows, vous devez donc installer cygwin sur celui-ci pour pouvoir exécuter des commandes en arrière-plan comme "sleep 20 &" dans l'exemple ci-dessous.

Vous pouvez exécuter ce livre de lecture avec ansible-playbook -vv background.yml Vous pouvez voir que cette sortie standard change. echo Test---- >> /tmp/test && tail /tmp/test est une commande de démonstration. Vous devez exporter les données dans un fichier et les configurer pour pouvoir voir la progression. Ou vous pouvez regarder la taille du fichier stdout et l'afficher. Utilisez votre imagination)))

# @file background.yml

- hosts: 127.0.0.1
  connection: local
  gather_facts: no

  tasks:
  - name: Background operation
    Shell: "sleep 20 & \ PPID=$! \ echo $PPID"
    register: bcktsk

  - name: Check PPID
    Shell: "kill -0 {{ bcktsk.stdout | int + 2 }}"
    register: checkppid
    ignore_errors: true

  - name: Check if process still active
    Shell: "echo Test---- >> /tmp/test && tail /tmp/test && kill -0 {{ bcktsk.stdout | int + 2 }}"
    register: test
    when: checkppid.rc == 0
    until: test.rc ==1
    delay: 2
    retries: 10000
    ignore_errors: true
6
podarok

Mon approche pour le module localhost:

...
module.log(msg='test!!!!!!!!!!!!!!!!!')
...

Puis sur une autre fenêtre:

 $ tail -f /var/log/messages

 Nov 29 22:32:44 nfvi-ansible-xxxx python2: ansible-test-module test!!!!!!!!!!!!!!!!!
5
Riccardo79

Il existe un moyen de contourner ce problème et d'afficher une sortie en temps réel. Cependant, vous devrez gérer des préfixes injectés sur chaque ligne. C'est désordonné/hackish, mais pour le débogage/surveillance, le travail est fait:

- name: Run some command and echo it's realtime stdout
  Shell: ":"
  with_lines: "/usr/bin/some_long_running_command with arguments and such here"

La commande : est juste un noop, vous pouvez facilement utiliser command: /usr/bin/true si c'est plus facile. Dans tous les cas, cela produira des lignes similaires à:

changed: [localhost] => (item=first output line)
changed: [localhost] => (item=second output line)
changed: [localhost] => (item=third output line)
1
chris