关于debian:安装软件包时触发“changed:true”的原因是什么?

What triggers a “changed: true” when installing a package?

我有几个使用ansible的Debian服务器。其中一项任务是安装一些软件包。机器之间的行为是不同的,特别是在重新运行剧本时,一些机器重新安装包,而另一些则没有。

相关的剧本部分:

1
2
3
  - name: install logstash on debian
    apt: deb=/tmp/logstash.deb
    when: ansible_os_family =="Debian"

两台机器的详细输出是:

1
2
3
4
5
6
7
8
9
10
TASK: [install logstash on debian] ********************************************
changed: [eu5.example.com] => {"changed": true,"stderr":"","stdout":"(Reading database ... 45337 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 (215-17+deb8u2) ...
"}

TASK: [install logstash on debian] ********************************************
ok: [eu2.example.com] => {"changed": false,"stderr":"","stdout":""}

触发changed状态的机制是什么?由于在两台机器上已经安装了logstash(在同一级别,来自同一个包),因此有两种可能的情况:

  • 每次都要运行apt命令,无论是否安装了包(在这种情况下eu5的行为是正常的,eu2不是)
  • 或者检查软件包是否已安装并且是否已跳过(在这种情况下,上面的OK / not OK行为被切换)

直接安装:

1
2
3
4
5
6
[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) ...

这表明每次都会重新安装软件包(因此ansibleeu2上的行为有问题)。如果确实如此:只有在没有安装软件包的情况下才有条件安装吗? (之前的一些答案表明dpkg中没有内置的机制)


无论何时安装,升级或删除软件包,apt模块都应返回changed: True。 我怀疑这个错误是在Ansible中,因为这是最常用的模块之一,边缘情况可能在这一点上都被某人击中了。 不过,你可能想绕过它并继续前进。 你可以这样做:

1
2
3
4
5
6
- command: dpkg -s logstash
  register: logstash_available
  ignore_errors: True
- name: install logstash on debian
  apt: deb=/tmp/logstash.deb
  when: logstash_available.rc != 0