我有三个 linux 服务器,我创建了 ansible 库存文件:
[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(也存储在数据库中的 svn 路径)复制到服务器。我如何使用 ansible 功能做到这一点?
Ansible 没有直接检查任何程序版本的模块。您有两个选项,都涉及从脚本输出中提取版本号的 bash 命令。这可能应该这样做:
选项 1:运行任务以获取版本。基本上你已经拥有的加上版本提取。
现在您
versions
注册了一个变量versions.result
,其中包含一个 dicts 列表,其中包含 sw_path 和每个循环项的返回值。像这样的东西:
要查看注册数据的真实内容,请使用如下调试任务:
选项 2:使用自定义事实
您可以在返回版本的远程主机(当然使用 Ansible)上安装脚本。当 Ansible 连接到这些主机时,它将自动运行这些脚本并将它们用作事实,就像任何其他系统属性一样。
这是当地事实的文档。
脚本可以像这样简单:
输出应如下所示:
您可以使用 Ansible 安装此脚本,例如使用模板模块。因此,您甚至可以根据您的项目列表使其动态化
sw_path
。安装后,您需要重新加载事实。您可以在模板任务之后立即使用此任务执行此操作:
现在您将能够直接访问版本
ansible_local.versions.beer
等。检测版本就这么多。
您没有提到它,但我假设您确实知道如何从数据库中获取版本以进行比较。否则,您将需要提供更多数据。因此,假设您将“应该版本”存储为
should["beer"]
,should["vodka"]
和should["whiskey"]
.您现在可以使用version_compare过滤器比较版本。
如果安装了比数据库中引用的新版本,这只会升级但永远不会降级。当然,您可以直接比较字符串并确保始终安装准确的版本。