【问题标题】:How to compare variables from a dynamic inventory in ansible如何在ansible中比较动态库存中的变量
【发布时间】:2020-11-13 21:51:53
【问题描述】:

我一直在尝试创建一个将比较来自不同主机的文件计数的剧本。

  - shell: << code to count number of lines >> 
    register: record_count

  - debug:
      msg: "The count is {{ record_count.stdout }}"

- hosts: localhost
  tasks:

  - name: Fail if the count doesnt match
    fail:
      msg: "The record count is not matching on both the export files."
    when: "{{ hostvars[groups.apa[0].record_count.stdout }} != {{ hostvars[groups.apa[1].record_count.stdout }}"

但由于我们的库存非常动态,我们似乎无法使用主机组。我也尝试过将库存主机名保存在变量上,但据我所知,它保存在托管主机上,而不是保存在我将进行比较的本地主机上,我无法使主机变量工作

  - name: get current record count in from Latest ldapexport file
    shell: << count code here >>
    register: record_count

  - name: save inventory hostname to variable 1
    set_fact:
        server1: "{{ inventory_hostname }}"
    when: server1 is not defined
    run_once: true

  - debug:
      msg: value of Server 1 is {{ server1 }}

  - name: save inventory hostname to variable 2
    set_fact:
        server2: "{{ inventory_hostname }}"
    when: server1 is defined and server2 is not defined

  - debug:
      msg: value of Server 2 is {{ server2 }}

  - name: compare
    debug:
      msg: they are equal
    when: "{{ hostvars[vars[server1]].record_count.stdout }} == {{ hostvars[vars[server2]].record_count.stdout }}"
    delegate_to: localhost
    run_once: true

任何想法都将不胜感激。谢谢!

【问题讨论】:

  • 缺少右括号hostvars[groups.apa[0]

标签: dynamic ansible ansible-inventory


【解决方案1】:

问:"...它保存在托管主机上,而不是本地主机上..."

A:使用相同的主机和 run_once: true delegate_to: localhost 任务运行第二次游戏。例如,下面的库存和剧本

shell> cat hosts
[my_group1]
test_01
test_02

[my_group2]
test_03
shell> cat playbook.yml
- hosts: my_group1, my_group2
  tasks:
    - shell: cat /etc/passwd| wc -l
      register: record_count
    - debug:
        var: record_count.stdout

- hosts: my_group1, my_group2
  vars:
    apa:
      - my_group1
      - my_group2
  tasks:
    - debug:
        msg: "{{ hostvars[item].record_count.stdout|trim }}"
      loop: "{{ groups[apa[0]] }}"
      run_once: true
      delegate_to: localhost
    - debug:
        msg: "{{ hostvars[item].record_count.stdout|trim }}"
      loop: "{{ groups[apa[1]] }}"
      run_once: true
      delegate_to: localhost

给(删节)

shell> ansible-playbook -i hosts playbook.yml 

PLAY [my_group1, my_group2] ***************************

ok: [test_01] => 
  record_count.stdout: '      37'
ok: [test_02] => 
  record_count.stdout: '      31'
ok: [test_03] => 
  record_count.stdout: '      29'

PLAY [my_group1, my_group2] ***************************

ok: [test_01 -> localhost] => (item=test_01) => 
  msg: '37'
ok: [test_01 -> localhost] => (item=test_02) => 
  msg: '31'

ok: [test_01 -> localhost] => (item=test_03) => 
  msg: '29'

注意事项:

  • 表达式hostvars[groups.apa[0]].record_count.stdout 是错误的。 hostvars[groups.apa[0]] 是组 apa[0] 中的主机列表。列表中的项目有属性record_count 而不是列表。

  • 如果(非常动态的)主机可能会即时消失,请使用default 过滤器。例如

"{{ hostvars[item].record_count.stdout|default(-1)|trim }}"
  • 如果要比较它们的变量,请决定如何选择主机对。

【讨论】:

  • 谢谢!这很有帮助!我确实设法找到了一种获取主机列表的方法,这是主要问题,然后我采用了这种方法。似乎hostvars 不适用于delegate_to。对流程有很大帮​​助,谢谢!
猜你喜欢
  • 2013-12-31
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多