Ansible-仅在一台主机上查找最大值并基于结果运行操作

Ansible-仅在一台主机上查找最大值并基于结果运行操作,ansible,Ansible,我有一组名为db的主机,其节点数量可能会有所不同。每个节点都有一个事实序号,它是一个整数 我需要在所有主机之间比较这一事实并选择最大值,然后在一个且只有一个具有此最大值的主机上运行一些操作。如果多个节点具有相同的值,则应选择第一个节点 我尝试过这种方法: - name: find max seqno value set_fact: seqno_max={{ [hostvars[groups['db'][0]]['seqno'], hostvars[groups['db'][1]]['seqn

我有一组名为db的主机,其节点数量可能会有所不同。每个节点都有一个事实序号,它是一个整数

我需要在所有主机之间比较这一事实并选择最大值,然后在一个且只有一个具有此最大值的主机上运行一些操作。如果多个节点具有相同的值,则应选择第一个节点

我尝试过这种方法:

- name: find max seqno value
  set_fact: seqno_max={{ [hostvars[groups['db'][0]]['seqno'], hostvars[groups['db'][1]]['seqno']] | max }}

- name: find single hostname to use as a node with max seqno
  set_fact: seqno_max_host={{ hostvars[item]['inventory_hostname'] }}
  with_items: groups['db'][::-1] # reverse list. if two nodes have the same seqno, use first node as starting point.
  when: hostvars[item]['seqno'] == seqno_max

- name: Some actions based on a result of previous tasks
  action: # Run some actions
  when:  seqno_max_host == inventory_hostname
但是由于某些原因,max操作符总是返回第二个值。此外,这种方法只有在您有任意数量的主机时才有效——我希望有一个适用于任意数量主机的解决方案


编辑:结果是hostvars将整数转换回了字符串,所以比较它们会得到意外的结果。在max filter中为每个hostvars引用重新应用int filter会有所帮助。尽管如此,问题仍然存在,如何修复上面的代码以使其适用于任意数量的主机-是否可以不编写自定义筛选器或创建临时模板

我最终得到了一个解决方案,这个解决方案并不漂亮,但很有效

- shell: "if [ {{ hostvars[inventory_hostname]['seqno'] }} -lt {{ hostvars[item]['seqno'] }} ]; then echo {{ hostvars[item]['seqno'] }}; fi"
  with_items: groups['db']
  register: result_c

- set_fact: seqno_max={{ hostvars[inventory_hostname]['seqno'] }}
  when: result_c.results | map(attribute='stdout') | join('') == ""