我正在尝试用ansible设置我的dotfiles / machine bootstrap东西,我想安装一堆GUI工具,但前提是我在支持它的机器上。我正在使用ansible_os_family == 'Debian'
来检测apt-get是否有效。不知道如何检查是否安装了例如gtk或类似的东西。
答案 0 :(得分:4)
Ansible有很多support for package managers,并且很乐意与apt合作。不幸的是,目前还没有办法检查是否使用此模块安装了软件包。但是,这可以通过注册命令的结果来完成。这样的事情应该有效:
- name: Check if gtk is installed
command: dpkg-query -l gtk
register: gtk_check
- name: Install GTK application
apt: name=gtk-program state=present
when: gtk_check.stdout.find('no packages found') != -1
答案 1 :(得分:1)
我建议通过在此服务上运行Ansible来查看报告的事实,以查看是否存在可以检查的特定事实。从Ansible FAQ开始,只需查看所有事实:
ansible -m setup hostname
如果它没有提供任何有用的东西,那么下一个选项是运行任务并将结果保存到您可以测试的变量。任务可能是调用命令,检查是否安装了包等。
前段时间我不得不写一个可能最终在redhat或debian系统上运行的剧本,所以我需要检查是否安装了yum,并根据它确保安装了python-apt或者其他redhat包的数量。以下是我最终如何做到这一点:
- name: Check if yum exists
stat: path=/usr/bin/yum
register: yum
# The python-apt package must be installed before the apt module below
# can be invoked...
- name: Check if python-apt is installed
shell: dpkg -l python-apt | grep python-apt
register: apt_status
when: yum.stat.exists == False
- name: Install python-apt
command: apt-get install -y python-apt
when: yum.stat.exists == False and apt_status.stdout.find('un') == 0
# procmail & postfix are needed for the lockfile command & ability to
# send e-mail
- name: Install required packages
yum: pkg={{ item }} state=present
with_items:
- procmail
- postfix
when: yum.stat.exists == True
第一项任务只检查/ usr / bin / yum是否存在,并将结果存储在名为" yum"的变量中。第二个任务将检查是否仅在yum不存在时才安装python-apt(因此它假设缺少yum表明这实际上是debian系统)。第三个任务强制安装python-apt,只有它不存在(并且它是debian系统)。只有当yum存在时,最后一个任务才会通过yum安装一些软件包。
它有点啰嗦,但使用上述方法中的一个或两个可以帮助您找出确定是否安装了GUI的最佳方法。您可以通过shell或命令模块调用/ sbin / runlevel(运行级别5通常意味着X11正在运行),或者您可以像我上面那样调用dpkg来测试是否安装了特定的软件包。或者你可以简单地使用stat模块来查看/ etc / X11 / xinit / xinitrc之类的路径或文件是否存在。然后,只需将任务结果注册到变量并使用适当的"当"后续任务中的条款。