我有500多个目标服务器,它们具有兼容的python version 2.7
安装在如下所示的不同位置。
/ usr / bin / python /opt/apps/xerto/tools/ansible/bin/python2.7
/opt/atlassian/tools/ansible/bin/python2.7
/opt/wsp/apps/ansible/python2.7/bin/python2.7
/opt/wsp/apps/tools/ansible/python2.7/bin/python2.7
/opt/docs/python/bin/python2.7
/home/admin/ansible/bin/python2.7
/opt/operations/Python-2.7.8/bin/python
/opt/ora/python/bin/python2.7
/opt/tomcat/tools/ansible/bin/python2.7
每次我都必须在ansible主机文件中为ansible_python_interpreter
设置上述python路径之一,具体取决于我的ansible将连接的目标服务器。
我的目的是在目标服务器上进行很少或根本不做任何更改,而是在敏感的一端解决此问题。
是否有一种聪明的方法来弄清楚所需的python在哪里?
请提出建议。
Ansible version: 2.7.1
答案 0 :(得分:1)
是否有一种聪明的方法来弄清楚所需的python在哪里?
- hosts: all
# since we have no working python yet, don't bother
gather_facts: no
vars:
possible_pythons:
- /usr/bin/python
- /opt/apps/xerto/tools/ansible/bin/python2.7
- /opt/atlassian/tools/ansible/bin/python2.7
- /opt/wsp/apps/ansible/python2.7/bin/python2.7
tasks:
- raw: if [ -x "{{ item }}" ]; then echo "{{ item }}"; fi
with_items: "{{ possible_pythons }}"
register: pystat
when: pystat is not defined or (pystat.stdout|length) == 0
- set_fact:
ansible_python_interpreter: '{{ pystat.results | selectattr("stdout") | map(attribute="stdout") | first }}'
# NOW we can run the fact gathering step
- setup:
- debug:
msg: and now we are off to the races!
我认为当然也可以使用shell迭代来做到这一点,但是我没有测试它,也没有考虑所有的极端情况:
- raw: |
PYTHONS='{{ possible_pythons | join(" ") }}'
for p in $PYTHONS; do
if [ -x "$p" ]; then echo "$p"; break; fi
done
register: the_python