我为一个python应用程序安装了一些服务器,其中一些是CentOS,另一些是debian。
有没有一个方便的方法来find一个程序,可以安装在不同的地方,而不诉诸下面的例子,并没有重复相同的命令几次(不同的when:子句)?
例如,在CentOS上是/sbin/nologin ,在debian上是/usr/sbin/nologin 。 我一直在试图find并注册一个variables的path,但似乎很愚蠢:
- 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
在我的具体情况下,我正在尝试为pip模块find正确的virtualenv_command 。 我必须是具体的,否则我会得到错误的(即对于Python 2)或不存在的path。
我的系统将有一个pyvenv,pyvenv-3.4,virtualenv或virtualenv-3.4。 至less有一个会出现,但根据操作系统和python的安装方式,它们在不同的地方或根本不存在。
如果你知道你可以用来推断位置的规则,那么最好使用它们(CentOS与python2.7应该有它…)
那么你可能可以做类似的事情
- 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
一旦find它,而不是注册variables,将它作为一个自定义的事实存储它不会伤害,所以下次可用: http : //serverascode.com/2015/01/27/ansible-custom-facts.html