Измените глобальную переменную или проанализируйте все переменные хоста для условия

#ansible

#ansible

Вопрос:

Мне нужно изменить глобальную переменную или проанализировать все переменные хоста для условия.

На что я надеялся:

  • Установите глобальную переменную в group_vars — «commit_success: true»
  • Для каждого хоста внесите и «зафиксируйте» изменение.
  • Каждый хост отменяет изменение, если в течение X минут не получено сообщение «подтвердить фиксацию».
  • Проверьте функциональность каждого хоста. Если обнаружен сбой, «set_fact: commit_success=false»
  • Только если все хосты имеют «commit_success=true», не подтверждайте фиксацию КАКОГО-ЛИБО хоста (чтобы предотвратить их возврат)

group_vars/all.yaml

 commit_success: true
  

Проверяет, была ли успешно применена конфигурация хоста. Если произошел 1 или более сбоев, измените переменную commit_success этого хоста на false

     - name: Compare Each Snapshot
      when: 
        - snap_check.total_failed >= 1
      set_fact: 
        commit_success: false
  

Это не приведет к фиксации изменений на хостах, которые завершились сбоем, но я не хочу фиксировать НИ на каком узле, даже если произойдет сбой только на одном узле. Это все или ничего.

     - name: Confirm Commit
      when: 
        - commit_success
      juniper_junos_config:
        provider:  "{{ credentials }}"
        config_mode: "{{ netconf.mode }}"
        commit: true
        comment: "{{ netconf.comment }}"
        commit_empty_changes: false
  

Мой результат таков, когда 4 узла не проходят проверку.

 ok: [d01-bbrj01] => {
    "commit_success": true
}
ok: [d03-bbrj03] => {
    "commit_success": true
}
ok: [d02-bbrj02] => {
    "commit_success": true
}
ok: [d04-bbrj04] => {
    "commit_success": true
}
ok: [d05-bprj01] => {
    "commit_success": true
}
ok: [d06-bprj02] => {
    "commit_success": true
}
ok: [d07-dsrj01] => {
    "commit_success": false
}
ok: [d08-dsrj02] => {
    "commit_success": false
}
ok: [d09-dsrj03] => {
    "commit_success": false
}
ok: [d10-dsrj04] => {
    "commit_success": false
}

  

Опять же, я либо хочу изменить глобальную переменную, либо я хочу проверить, что «commit_success: true» для ВСЕХ хостов, прежде чем подтверждать фиксацию.

Комментарии:

1. итак, по сути, вам нужна глобальная переменная global_commit_success и установите ее значение в true, если все «локальные» переменные commit_success (как в вашем последнем фрагменте вашего вопроса) являются true?

2. Это правильно. Альтернативой является использование глобально определенной переменной, которая будет изменена, если какой-либо хост выйдет из строя. В противном случае оно не будет изменено

Ответ №1:

Если я правильно понимаю, о чем вы спрашиваете, я думаю, что решение простое. Установите commit_success индивидуально для каждого хоста. Нам не нужна глобальная переменная:

 - name: Set commit_success
  set_fact: 
    commit_success: "{{ snap_check.total_failed == 0 }}"
  

Обратите внимание, что мы удалили when условие здесь, чтобы каждый хост
будет иметь commit_success факт.

На хосте, на котором будет выполняться juniper_junos_config задача, мы устанавливаем конечную переменную путем перебора узлов из предыдущей задачи:

     - set_fact:
        all_commit_success: "{{ all_commit_success|default(true)|bool and hostvars[item].commit_success }}"
      loop: "{{ groups.devices }}"
  

Теперь мы можем использовать это условие в juniper_os_config задаче:

     - name: Confirm Commit
      when: 
        - all_commit_success
      juniper_junos_config:
        provider:  "{{ credentials }}"
        config_mode: "{{ netconf.mode }}"
        commit: true
        comment: "{{ netconf.comment }}"
        commit_empty_changes: false