我如何检查Ansible的软件版本?

我有三个Linux服务器,我创build了可靠的库存文件:

[web] 192.168.0.155 192.168.0.165 192.168.0.175 

我有playbook.yml:

 --- - hosts: web tasks: - name: Check drinks versions shell: "python3.4 {{ item.sw_path }} -v" sudo: yes with_items: - { sw_path: '/home/beer.py' } - { sw_path: '/home/vodka.py' } - { sw_path: '/home/whisky.py' } 

脚本(beer.py,vodka.py和whisky.py)以如下格式打印其版本:“/home/beer.py 1.0.0”。 我需要得到这个版本,比较它与我存储在数据库中的版本(这是实际版本),如果版本不相等,然后从svn(也存储在数据库中的svnpath)复制实际版本到服务器。 我该如何使用可靠的function呢?

Ansible没有一个模块来直接检查任何程序的版本。 你有两个select,都涉及一个bash命令从脚本的输出中提取版本号。 这应该可能做到:

 $program | rev | cut -d ' ' -f1 | rev 

选项1:运行任务来获取版本。 基本上你已经有了版本提取。

 - name: Check drinks versions shell: "python3.4 {{ item.sw_path }} -v | rev | cut -d ' ' -f1 | rev" sudo: yes with_items: - { sw_path: '/home/beer.py' } - { sw_path: '/home/vodka.py' } - { sw_path: '/home/whisky.py' } register: versions 

现在你已经注册了一个variablesversions ,在versions.result是一个包含sw_path和每个循环项目的返回值的字典列表。

像这样的东西:

 "results": [ { "item": { "sw_path": "/home/beer.py" }, "stdout": "1.0.0" }, { "item": { "sw_path": "/home/vodka.py" }, "stdout": "1.0.0" }, { "item": { "sw_path": "/home/whiskey.py" }, "stdout": "1.0.0" } } 

要查看注册数据的实际内容,请使用如下所示的debugging任务:

 - debug: var=versions 

选项2:使用自定义事实

您可以在远程主机上安装一个脚本(当然是Ansible),它将返回这些版本。 当Ansible连接到这些主机时,它将自动运行这些脚本并将它们用作事实,就像任何其他系统属性一样。

这里是地方事实的文件。

脚本可以这样简单:

 #!/bin/sh echo [versions] echo beer=$(python3.4 /home/beer.py -v | rev | cut -d ' ' -f1 | rev) echo vodka=$(python3.4 /home/vodka.py -v | rev | cut -d ' ' -f1 | rev) echo whiskey=$(python3.4 /home/whiskey.py -v | rev | cut -d ' ' -f1 | rev) 

输出应该是这样的:

 [versions] beer=1.0.0 vodka=1.0.0 whiskey=1.0.0 

您可以使用Ansible安装此脚本,例如使用模板模块。 所以你甚至可以根据你的sw_path项目列表使其dynamic化。

安装后,您需要重新载入事实。 您可以在模板任务之后立即执行此任务:

 - setup: filter: ansible_local 

现在你将能够直接访问版本ansible_local.versions.beer

这么多的检测版本。

你没有提到它,但我认为你知道如何从数据库中获取版本进行比较。 否则,你将需要提供更多的数据。 所以我们假设你有“应该版本”存储should["beer"]should["vodka"]should["whiskey"]

您现在可以将版本与version_comparefilter进行比较。

 - subversion: dummy command installing {{ item }} with_items: - beer - vodka - whiskey when: "{{ ansible_local.versions[item] | version_compare(should[item], '<') }}" 

这只会升级,但不会降级,以防在数据库中引用的新版本被安装。 当然,您可以直接比较string,并确保始终安装确切的版本。

 when: "{{ ansible_local.versions[item] != should[item] }}"