Je semble avoir des problèmes avec l'utilisation d'une condition when dans une balise meta. J'ai essayé quelques variantes et j'ai également lu, toujours incertain, alors j'ai pensé demander ici aussi

Tâches

- name: "This is my task"
  command: "{{ path to conda }} {{ script }}"
  register: check
  until: check is succeeded
  retries: 5
  no_log: false

- name: "End this play if the script ran successfully on 1 remote target"
  meta: end_play
  when: 
    - check is succeeded

Erreur

ERREUR! La vérification conditionnelle « la vérification a réussi » a échoué. L'erreur était : Le test échoué attend un dictionnaire L'erreur semble avoir été dans '/path/to/roles/tasks/main.yml' : ligne 9, colonne 3, mais peut être ailleurs dans le fichier en fonction de la syntaxe exacte problème. La ligne incriminée semble être : - nom : "Terminer cette lecture si le script s'est exécuté avec succès sur 1 cible distante" ^ ici

Mise à jour (partage dans un souci de finalisation)

Partage de la solution de contournement prescrite. Dans mon cas d'utilisation, je voulais essentiellement "essayer" une tâche sur l'intégralité de l'inventaire jusqu'à réussi

J'ai fini par utiliser les vars de l'hôte. Cela tentera toujours la tâche s'il s'agit du 1er hôte de l'inventaire et « regardera en arrière » la tentative de l'hôte précédent avant de décider de l'exécuter à nouveau sur le prochain hôte d'inv.

# my task
- name: "Attempt this task on each host if unsuccessful"
  raw: "raw_command_here_as_remote_host_is_using_rbash"
  register: status
  when: >
    inventory_hostname == ansible_play_hosts_all[0] or
    hostvars [ ansible_play_hosts_all [ groups ['my_host_group'].index(inventory_hostname) | int - 1 ] ] ['stop_it'] == 'false'
  ignore_errors: yes
  until: status is succeeded
  retries: 1

- set_fact:
    stop_it: true
    cacheable: yes
  when: status is succeeded

- set_fact:
    stop_it: false
    cacheable: yes
  when: status is not succeeded
1
nauf 12 févr. 2020 à 01:41

1 réponse

Meilleure réponse

Mise à jour (partage de la réponse dans un souci de finalisation)

Partage de la solution de contournement prescrite. Dans mon cas d'utilisation, je voulais essentiellement "essayer" une tâche sur l'intégralité de l'inventaire jusqu'à ce qu'elle réussisse

J'ai fini par utiliser les vars de l'hôte. Cela tentera toujours la tâche s'il s'agit du 1er hôte de l'inventaire et « regardera en arrière » la tentative de l'hôte précédent avant de décider de l'exécuter à nouveau sur le prochain hôte d'inv.

# my task
- name: "Attempt this task on each host if unsuccessful"
  raw: "raw_command_here_as_remote_host_is_using_rbash"
  register: status
  when: >
    inventory_hostname == ansible_play_hosts_all[0] or
    hostvars [ ansible_play_hosts_all [ groups ['my_host_group'].index(inventory_hostname) | int - 1 ] ] ['stop_it'] == 'false'
  ignore_errors: yes
  until: status is succeeded
  retries: 1

- set_fact:
    stop_it: true
    cacheable: yes
  when: status is succeeded

- set_fact:
    stop_it: false
    cacheable: yes
  when: status is not succeeded
0
nauf 27 avril 2020 à 21:52