使用 Ansible 查找可能位于多个不同位置的程序

使用 Ansible 查找可能位于多个不同位置的程序

我正在为一个 python 应用程序对几个服务器进行 ansibilizing,其中一些是 CentOS,其他是 debian。

是否有一种方便的方法来定位可以安装在各个地方的程序,而不必诉诸下面的示例,也不必多次重复相同的命令(使用不同的when:子句)?

例如,在 CentOS 上是/sbin/nologin,在 debian 上是/usr/sbin/nologin。我一直试图在变量中查找和注册路径,但这似乎很愚蠢:

- name: Find nologin
  command: ls -1 /usr/sbin/nologin
  ignore_errors: yes
  register: nologin_command

- name: Find nologin 
  command: ls -1 /sbin/nologin
  register: nologin_command
  when: nologin_command.stdout == ""

# nologin_command.stdout will be the path to one or the other

在我的具体情况下,我实际上试图找到正确virtualenv_command点子模块。我必须具体说明,否则我会得到错误的模块(例如,对于 Python 2)或不存在的路径。

我的系统将具有 pyvenv、pyvenv-3.4、virtualenv 或 virtualenv-3.4 之一。至少会有一个,但根据操作系统和 python 的安装方式,它们位于不同位置或根本不存在。

答案1

如果您知道可以用来推断位置的规则,最好使用它们(带有 python2.7 的 CentOS 应该有它...)

嗯你也许可以做类似的事情

- name: Find nologin
  command: ls -1 /usr/sbin/nologin /sbin/nologin /usr/local/sbin/nologin
  ignore_errors: yes
  register: nologin_command

我认为使用循环with_items虽然更易读,但结果却更难使用。或者find在可能的目录中使用:

 - name: Find venv
   command: find /usr/bin /usr/local/bin /opt -executable -type f -name pyvenv -o -name pyvenv-3.4 -o -name virtualenv -o name virtualenv-3.4
   ignore_errors: yes
   register: nologin_command

一旦找到它,而不是注册变量,将其存储为自定义事实以便下次可用就不会有什么坏处:http://serverascode.com/2015/01/27/ansible-custom-facts.html

相关内容