#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. Этот ответ предоставляет вам пример того, как обновить ваш вопрос.