2015-03-26 6 views
4

Я пытался выполнить простую команду, используя python --version анзибль, и она не работала независимо от того, как я попробовал: через shell модуль, с помощью command модуля, с помощью script модуля, с помощью playbook или ad-hoc.анзибль - как ansible_env.PATH установлен в SSH сессии

Я всегда получаю сообщение об ошибке:

unknown option

Например, сборник пьес:

--- 

- name: testing 
    hosts: myhost 
    sudo: False 

    tasks: 
     - name: python version 
     shell: python --version 

Тогда я понял, что это связано с тем, как анзибль загружает среду в SSH сессии. Эффективно ошибка не исходила из синтаксического анализа Ansible или команды, а из версии 2.4 Python, которая каким-то образом попадает в PATH (/usr/local/bin).

Похоже, Python 2.4 не знал флага --version.

Самая интересная часть заключается в том, что когда я выполняю SSH на том же хосте, что и тот же пользователь, что и Ansible, я получаю PATH элементов в правильном порядке, и первое место, где существует Python, является правильным с Python 3 , а /usr/local/bin похоронен глубоко в PATH.

Но когда я добавил which python задачу в сборник пьес я видел, что анзибль решает Python из /usr/local/bin и что это старый (v2.4)

Когда я исполняю ansible myhost -m setup я могу видеть, что переменная ansible_env.PATH путь короче, чем PATH. Я получаю вход в систему напрямую.

Было бы неплохо понять правила того, как это делается.

Точно такой же вопрос был задан здесь:

http://grokbase.com/t/gg/ansible-project/1479n0d0qp/ansible-env-path-how-is-it-set

, но не было никакого определенного ответа.

ответ

1
  • Чтобы получить версию python исполняющих свои модули и сам анзибль вы должны использовать ansible_fact ansible_python_version
  • (мой самедельному рекомендацию) Используйте полный путь при использовании command модуля.

so the correct answer for me was: in inventory file set the ansible_python_interpreter=/path/to/correct/python and then it will be able to use the indicated python when logging to the remote and obviously find it in the PATH.

Это не верно. - shell: python --version не использовал бы ansible_python_interpreter. Он просто выполняет любую команду, которую вы даете, просматривая исполняемый файл (если это не абсолютный путь) в PATH.

E.g. если

  • вы настройка ваших файлов запуск (/etc/profile, /etc/profile.d/*, .*rc и т.д.), так что питон 2.4 является первым в PATH и
  • вы установите ansible_python_interpreter в /path/to/python3 для my_host

затем:

- hosts: my_host 
    tasks: 
    - debug: msg="{{ansible_python_interpreter}}"  # would print /path/to/python3 
    - debug: msg="{{ansible_python_version}}"   # would print 3.x 
    - shell: python -c 'import sys; print sys.version' # would execute python 2.4 
     register: py_version 
    - debug: msg="{{py_version}}"      # would print 2.4 

То, что вы должны делать это один из следующих действий:

  • набор PATH правильно. (это не вариант, потому что «как непонятные наборы PATH» не определены, см. комментарий Юджина ниже)
  • использовать абсолютный путь с модулем command (или shell, если на то пошло).
+1

Вы правы, ansible_python_interpreter не решает проблему PATH. Путаница исходит из того факта, что нет способа сказать, как установлен параметр ansible_env.PATH, и я не единственно путаюсь: http://grokbase.com/t/gg/ansible-project/1479n0d0qp/ анзибль-ENV-путь-как-это-это набор –

Смежные вопросы