修改全局变量或解析条件的所有主机变量

时间:2019-04-09 20:10:05

标签: 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 个答案:

答案 0 :(得分:3)

如果我理解您的正确要求,我认为解决方案很简单。为每个主机分别设置一个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