【发布时间】:2016-01-21 13:23:15
【问题描述】:
我有几个使用ansible 的Debian 服务器。其中一项任务是安装一些软件包。行为因机器而异,特别是在重新运行 playbook 时,一些机器会重新安装软件包,而另一些则不会。
相关剧本部分:
- name: install logstash on debian
apt: deb=/tmp/logstash.deb
when: ansible_os_family == "Debian"
两台机器的详细输出是:
TASK: [install logstash on debian] ********************************************
changed: [eu5.example.com] => {"changed": true, "stderr": "", "stdout": "(Reading database ... 45337 files and directories currently installed.)\nPreparing to unpack /tmp/logstash.deb ...\nUnpacking logstash (1:2.0.0-beta3-1) over (1:2.0.0-beta3-1) ...\nSetting up logstash (1:2.0.0-beta3-1) ...\nProcessing triggers for systemd (215-17+deb8u2) ...\n"}
TASK: [install logstash on debian] ********************************************
ok: [eu2.example.com] => {"changed": false, "stderr": "", "stdout": ""}
触发changed 状态的机制是什么?由于在两台机器上都已经安装了logstash(在同一级别,来自同一个包),有两种可能的情况:
-
aptcommand 应该每次都运行,无论是否安装了软件包(在这种情况下,eu5的行为正常,eu2的行为不行) - 或者检查是否安装了包并且跳过是这样(在这种情况下,上面的OK/not OK行为被切换)
直接安装:
[root@eu2:~]# dpkg -i /tmp/logstash.deb
(Reading database ... 232343 files and directories currently installed.)
Preparing to unpack /tmp/logstash.deb ...
Unpacking logstash (1:2.0.0-beta3-1) over (1:2.0.0-beta3-1) ...
Setting up logstash (1:2.0.0-beta3-1) ...
Processing triggers for systemd (227-2) ...
这表明每次都会重新安装软件包(因此ansible 在eu2 上的行为有问题)。如果确实如此:有没有办法仅在尚未安装软件包时有条件地安装? (有些previous answers suggestdpkg没有内置这种机制)
【问题讨论】:
-
查看模块代码,似乎它会首先查询可用的包,如果没有找到或在以前的版本中找到包,它只会“更改”(安装)。
dpkg -i /tmp/logstash.deb的输出在eu2和eu5之间是一样的吗? -
@AllanDenot:两种情况下的输出都是相同的(我在我的问题中发布的那个)。根据您的评论,第一次安装后应该没有变化(所以
eu2的行为是正确的)
标签: debian ansible ansible-playbook