有没有办法用json比较不同的变量?

有没有办法用json比较不同的变量?,json,ansible,Json,Ansible,我试图比较linux服务器上重启前/重启后运行的服务。但我无法让它输出差异 我现在使用的函数将pre/post状态输出到磁盘。但我更愿意将输出直接注册为变量 - name: populate service facts service_facts: register: facts - name: Outputting running services debug: var=item with_items: "{{ facts|json_query(query)}}" var

我试图比较linux服务器上重启前/重启后运行的服务。但我无法让它输出差异

我现在使用的函数将pre/post状态输出到磁盘。但我更愿意将输出直接注册为变量

- name: populate service facts
  service_facts:
  register: facts

- name: Outputting running services
  debug: var=item
  with_items: "{{ facts|json_query(query)}}"
  vars:
    query: 'ansible_facts.services.* | [?state == `running`].name'
应该以类似于

    - name: Missing running services
      debug:
         msg: {{ item }}
      with_items:
        - {{ facts_pre }}
        - {{ facts_post }}
      vars:
        query: 'ansible_facts.services.* | [?state == `running`].name'
      when: facts_pre.ansible_facts.services != facts_post.ansible_facts.services
结果应该与重新启动前显示的状态类似

ok: [hostname] => (item=NetworkManager.service) => {
    "item": "NetworkManager.service"
}
ok: [hostname] => (item=systemd-udevd.service) => {
    "item": "systemd-udevd.service"
}
ok: [hostname] => (item=sshd.service) => {
    "item": "sshd.service"
}
ok: [hostname] => (item=systemd-journald.service) => {
    "item": "systemd-journald.service"
}
由于某种原因,日志在引导过程中失败

ok: [hostname] => (item=NetworkManager.service) => {
    "item": "NetworkManager.service"
}
ok: [hostname] => (item=systemd-udevd.service) => {
    "item": "systemd-udevd.service"
}
ok: [hostname] => (item=sshd.service) => {
    "item": "sshd.service"
}

它将把systemd-journald.service注册到它自己的变量中。

您可以尝试使用
with_items
子句,在重新启动前后拥有列表的
交叉点。它将显示两个列表之间的所有差异

带有
sleep
任务的示例playbook,为您提供足够的时间从另一个会话停止/启动服务,以便您可以在
facts\u post
变量中捕获它:

---
- hosts: localhost
  gather_facts: false
  vars:
    web_folder:

  tasks:
  - name: populate service facts BEFORE
    service_facts:
    register: facts_pre

  - name: sleep to stop/start a service
    shell: sleep 10

  - name: populate service facts AFTER
    service_facts:
    register: facts_post

  - name: Missing running services
    debug:
       var: item
    with_items:
    - "{{ facts_pre | json_query(query) | symmetric_difference(facts_post | json_query(query)) }}"
    vars:
      query: 'ansible_facts.services.* | [?state == `running`].name'

希望有帮助。

查询提供了正在运行的服务列表

- service_facts:
- set_fact:
    running_services_A: "{{ ansible_facts.services|dict2items|
                            json_query('[?value.state == `running`].key') }}"
“要比较正在运行的服务”,请使用筛选器。比如说

- debug:
    msg: "Services running at A but not at B
          {{ running_services_A|difference(running_services_B) }}"
(未测试)
注释

  • 无需注册
    服务\u事实的输出。变量
    ansible\u facts.services
    自动创建。看