Ansible如何比较同一任务中多个主机的输出

时间:2017-03-02 16:41:56

标签: ansible

我有一个ansible playbook,其任务是为每个服务器输出已安装的Jenkins插件列表。

这是主机文件:

- name: Obtaining a list of Jenkins Plugins
  jenkins_script:
    script: 'println(Jenkins.instance.pluginManager.plugins)'
    url: "http://{{ inventory_hostname }}.usa.com:8080/"
    user: 'admin'
    password: 'password'

这是打印出每个jenkins服务器上安装的插件列表的任务:

loc

接下来我要做的是与所有服务器上安装的所有插件进行比较 - 以确保所有服务器都运行相同的插件。

我不一定要强制更新 - 可能会破坏 - 只是告知用户他们正在运行与其他服务器不同的插件版本。

我对ansible很新,很乐意接受任何关于如何实现这一目标的建议。

1 个答案:

答案 0 :(得分:0)

这有点难看,但应该有效:

- hosts: master
  tasks:
    - jenkins_script:
        script: 'println(Jenkins.instance.pluginManager.plugins)'
        url: "http://{{ inventory_hostname }}.usa.com:8080/"
        user: 'admin'
        password: 'password'
      register: call_result

    - copy:
        content: '{{ call_result.output }}'
        dest: '/tmp/{{ inventory_hostname }}'
      delegate_to: 127.0.0.1

    - shell: 'diff /tmp/{{groups.master[0]}} /tmp/{{ inventory_hostname }}'
      delegate_to: 127.0.0.1
      register: diff_result
      failed_when: false

    - debug:
        var: diff_result.stdout_lines
      when: diff_result.stdout_lines | length != 0

这会将jenkins_script模块的结果保存到调用主机(您运行ansible-playbook的位置),进入/tmp/{{hostname}}。之后,它将针对第一个服务器的结果以及其他每个人的正常diff运行,然后在有任何差异时打印出来。

它有点难看,因为它:

  • 在调用主机上使用/tmp来存储一些临时数据
  • 不自行清理
  • 使用diff shell命令,可以通过巧妙地使用jinja
  • 来实现

Ansible 2.3将有tempfile module,您可以用它来清理/tmp