Ansible - 如何检测您是否安装了GUI系统的Linux机器?

时间:2014-09-23 06:22:30

标签: user-interface ansible ansible-playbook

我正在尝试用ansible设置我的dotfiles / machine bootstrap东西,我想安装一堆GUI工具,但前提是我在支持它的机器上。我正在使用ansible_os_family == 'Debian'来检测apt-get是否有效。不知道如何检查是否安装了例如gtk或类似的东西。

2 个答案:

答案 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之类的路径或文件是否存在。然后,只需将任务结果注册到变量并使用适当的"当"后续任务中的条款。