如果缺少Apt包,则应该执行任务

Sim*_*eth 9 apt conditional-statements ansible ansible-playbook

如果缺少特定的apt包,我正在寻找一系列任务.

例如:

如果没有安装石墨碳,请执行以下操作:

- apt: name=debconf-utils state=present
- shell: echo 'graphite-carbon/postrm_remove_databases boolean false' | debconf-set-selections
- apt: name=debconf-utils state=absent
Run Code Online (Sandbox Code Playgroud)

另一个例子:

如果未安装statsd,请执行以下操作:

- file: path=/tmp/build state=directory
- shell: cd /tmp/build ; git clone https://github.com/etsy/statsd.git ; cd statsd ; dpkg-buildpackage 
- shell: dpkg -i /tmp/build/statsd*.deb
Run Code Online (Sandbox Code Playgroud)

我怎么会开始破解这个?

我想也许我可以做某个-shell: dpkg -l|grep <package name>并以某种方式捕获返回代码.

sdu*_*hil 7

您可以使用package_facts模块(需要 Ansible 2.5):

- name: Gather package facts
  package_facts:
    manager: apt

- name: Install debconf-utils if graphite-carbon is absent
  apt:
    name: debconf-utils
    state: present
  when: '"graphite-carbon" not in ansible_facts.packages'

...
Run Code Online (Sandbox Code Playgroud)


Sim*_*eth 6

看起来我的解决方案正在发挥作用.

这是我如何工作的一个例子:

- shell: dpkg-query -W 'statsd'
  ignore_errors: True
  register: is_statd

- name: create build dir
  file: path=/tmp/build state=directory
  when: is_statd|failed

- name: install dev packages for statd build
  apt:  name={{ item }} 
  with_items: 
    - git 
    - devscripts 
    - debhelper
  when: is_statd|failed

- shell: cd /tmp/build ; git clone https://github.com/etsy/statsd.git ; cd statsd ; dpkg-buildpackage 
  when: is_statd|failed

....
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:

 - name: test if create_superuser.sh exists
  stat: path=/tmp/create_superuser.sh 
  ignore_errors: True
  register: f

- name: create graphite superuser
  command: /tmp/create_superuser.sh
  when: f.stat.exists == True
Run Code Online (Sandbox Code Playgroud)

......还有一个

- stat: path=/tmp/build
  ignore_errors: True
  register: build_dir

- name: destroy build dir
  shell: rm -fvR /tmp/build 
  when: build_dir.stat.isdir is defined and build_dir.stat.isdir
Run Code Online (Sandbox Code Playgroud)


udo*_*dan 4

我认为您的做法是正确的dpkg | grep,只是返回代码0在任何情况下都是如此。但您可以简单地检查输出。

- shell: dpkg-query -l '<package name>'
  register: dpkg_result

- do_something:
  when: dpkg_result.stdout != ""
Run Code Online (Sandbox Code Playgroud)