Ansible не может найти python, даже если указан ansible_python_interpreter

#python #python-3.x #ansible

#python #python-3.x #ansible

Вопрос:

Я установил python 3.8.5 с помощью Homebrew, который помещает символическую ссылку на исполняемый /usr/local/bin/python3 файл, которая указывает на фактический исполняемый файл в /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3

Я могу ввести любой из них в свою оболочку, чтобы открыть python3 repl:

 $ /usr/local/bin/python3 
Python 3.8.5 (default, Jul 21 2020, 10:42:08) 
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D

$ /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3.8
Python 3.8.5 (default, Jul 21 2020, 10:42:08) 
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
  

У меня есть инвентарь со следующим хостом, который указывает путь к символической ссылке:

 all:
  hosts:
    vm:
      ansible_ssh_host: 127.0.0.1
      ansible_ssh_port: 2222
      ansible_user: "{{ deploy_username }}"
      host_key_checking: false
      ansible_python_interpreter: /usr/local/bin/python3
  

Когда я пытаюсь пропинговать свой сервер, я получаю эту ошибку:

 $ ansible all -i inventory.yml -m ping
vm | FAILED! => {
    "changed": false,
    "module_stderr": "Connection to 127.0.0.1 closed.rn",
    "module_stdout": "/bin/sh: /usr/local/bin/python3: No such file or directoryrn",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.nSee stdout/stderr for the exact error",
    "rc": 127
}
  

Ошибка говорит, что он не может найти python3. Я получаю ту же ошибку, если пытаюсь использовать более длинный путь через фреймворк. Если я удалю ansible_python_interpreter строку из своего инвентаря, по умолчанию она вернется к системному python /usr/bin/python , но в нем не установлены библиотеки, поэтому я не могу его использовать (и предпочел бы этого не делать, поскольку это более старая версия и управляется системой, а не мной).

Почему Ansible не может найти мою версию python, даже если я указываю полный путь?

Комментарии:

1. Я столкнулся с аналогичной проблемой с более старой версией ansible amp; python. $ python=<python-interpreter-path> ansible ... тогда это сработало для меня.

2. Сообщение «ansible all -i inventory.yml -m ping -vvv». Узнайте, как и к какому хосту вы подключаетесь. Попробуйте «ssh -p 2222 deploy_username@127.0.01 » и посмотрим, сможешь ли ты найти Python или нет.

3. Чтобы изолировать проблему, попробуйте Python без символической ссылки.

Ответ №1:

Приведенная ниже конфигурация работает с Python3 (3.6, 3.7, 3.8)

 shell> ssh -p 22 admin@127.0.0.1 which python3.6
/usr/local/bin/python3.6
  
 shell> cat .ansible/hosts
all:
  hosts:
    vm:
      ansible_ssh_host: 127.0.0.1
      ansible_ssh_port: 22
      ansible_user: admin
      ansible_python_interpreter: /usr/local/bin/python3.6
  
 shell> ansible all -m ping -vvv
ansible 2.8.5
  config file = /home/acadmin/.ansible.cfg
  configured module search path = ['/home/acadmin/.ansible/plugins/modules', '/usr/local/share/py36-ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.9 (default, Nov 14 2019, 01:16:50) [GCC 4.2.1 Compatible FreeBSD Clang 6.0.1 (tags/RELEASE_601/final 335540)]
Using /home/acadmin/.ansible.cfg as config file
host_list declined parsing /home/acadmin/.ansible/hosts as it did not pass it's verify_file() method
script declined parsing /home/acadmin/.ansible/hosts as it did not pass it's verify_file() method
auto declined parsing /home/acadmin/.ansible/hosts as it did not pass it's verify_file() method
Parsed /home/acadmin/.ansible/hosts inventory source with yaml plugin
META: ran handlers
Using module file /usr/local/lib/python3.6/site-packages/ansible/modules/system/ping.py
Pipelining is enabled.
<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: admin
<127.0.0.1> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o Port=22 -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="admin"' -o ConnectTimeout=30 -o ControlPath=/usr/home/acadmin/.ansible/cp/bfe1967dc6 127.0.0.1 '/bin/sh -c '"'"'/usr/local/bin/python3.6 amp;amp; sleep 0'"'"''
<127.0.0.1> (0, b'n{"ping": "pong", "invocation": {"module_args": {"data": "pong"}}}n', b'')
vm | SUCCESS => {
    "changed": false,
    "invocation": {
        "module_args": {
            "data": "pong"
        }
    },
    "ping": "pong"
}
META: ran handlers
META: ran handlers
  

Комментарии:

1. Хммм, это похоже на то, что вы подключаетесь к локальному серверу, а затем проверяете его местоположение на python. По какой-то причине у меня сложилось впечатление, что мне не нужна какая-либо конкретная версия python на удаленном сервере, который я настраивал. Может быть, это ложь / наивность?

2. Этот ответ предоставляет вам пример того, как обновить ваш вопрос.