我正在为一个 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