Iva*_*ich 4 python version-control scm ansible ansible-playbook
我有三台 Linux 服务器,我创建了 ansible 清单文件:
[web]
192.168.0.155
192.168.0.165
192.168.0.175
Run Code Online (Sandbox Code Playgroud)
我有 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' }
Run Code Online (Sandbox Code Playgroud)
脚本(beer.py、vodka.py 和whisky.py)以如下格式打印它们的版本:“/home/beer.py 1.0.0”。我需要获取这个版本,将它与我存储在数据库中的版本(这是实际版本)进行比较,如果版本不相等,则将实际版本从 svn(svn 路径也存储在数据库中)复制到服务器。我如何使用 ansible 功能做到这一点?
Ansible 没有直接检查任何程序版本的模块。您有两种选择,都涉及使用 bash 命令从脚本输出中提取版本号。这应该可以:
$program | rev | cut -d ' ' -f1 | rev
Run Code Online (Sandbox Code Playgroud)
选项 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
Run Code Online (Sandbox Code Playgroud)
现在你已经versions
注册了一个变量,inversions.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"
}
}
Run Code Online (Sandbox Code Playgroud)
要查看注册数据的真实内容,请使用如下调试任务:
- debug: var=versions
Run Code Online (Sandbox Code Playgroud)
选项 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)
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
[versions]
beer=1.0.0
vodka=1.0.0
whiskey=1.0.0
Run Code Online (Sandbox Code Playgroud)
您可以使用 Ansible 安装此脚本,例如使用模板模块。因此,您甚至可以根据您的sw_path
项目列表使其动态化。
安装后,您需要重新加载事实。您可以在模板任务之后立即使用此任务执行此操作:
- setup:
filter: ansible_local
Run Code Online (Sandbox Code Playgroud)
现在您将能够直接访问版本ansible_local.versions.beer
等。
检测版本就这么多。
你没有提到它,但我假设你知道如何从你的数据库中获取版本进行比较。否则,您将需要提供更多数据。因此,让我们假设您将“应该版本”存储为should["beer"]
,should["vodka"]
和should["whiskey"]
。
您现在可以使用version_compare过滤器比较版本。
- subversion: dummy command installing {{ item }}
with_items:
- beer
- vodka
- whiskey
when: "{{ ansible_local.versions[item] | version_compare(should[item], '<') }}"
Run Code Online (Sandbox Code Playgroud)
如果安装了比数据库中引用的版本更新的版本,这只会升级但永远不会降级。当然,您可以直接比较字符串并确保始终安装准确的版本。
when: "{{ ansible_local.versions[item] != should[item] }}"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17100 次 |
最近记录: |