如何比较ansible中动态清单中的变量
How to compare variables from a dynamic inventory in ansible
我一直在尝试创建一个剧本来比较来自不同主机的文件的数量。
- 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 }}"
但由于我们的库存非常动态,我们似乎无法利用主机组。我也尝试过将清单主机名保存在一个变量上,但据我所知,它保存在托管主机上而不是保存在我将进行比较的本地主机上,而且我无法使 hostvars 工作
- 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
任何想法将不胜感激。谢谢!
Q: "... it saves on the managed host and not on the localhost ..."
答:运行第二场和同一个主持人玩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 }}"
- 如果您想比较主机对的变量,请决定如何 select 主机对。
我一直在尝试创建一个剧本来比较来自不同主机的文件的数量。
- 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 }}"
但由于我们的库存非常动态,我们似乎无法利用主机组。我也尝试过将清单主机名保存在一个变量上,但据我所知,它保存在托管主机上而不是保存在我将进行比较的本地主机上,而且我无法使 hostvars 工作
- 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
任何想法将不胜感激。谢谢!
Q: "... it saves on the managed host and not on the localhost ..."
答:运行第二场和同一个主持人玩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 }}"
- 如果您想比较主机对的变量,请决定如何 select 主机对。