#python #ansible
#python #ansible
Вопрос:
Я пытаюсь вызвать функцию python из другого скрипта в другом каталоге. Есть учебник для выполнения этого.
Это отлично работает на localhost, но на remote_server происходит сбой с «ModuleNotFoundError: нет модуля с именем ‘script2′»
Вот мои сценарии:
[root@server Test]# ls
hosts playbook python1 python2
[root@server Test]# cat playbook/playbook.yml
- hosts: "{{ host }}"
gather_facts: yes
become: yes
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Connect to MongoDB
script: ../python1/script1.py
args:
executable: python3
[root@server Test]# cat python1/script1.py
#!/usr/bin/python
import os
import sys
sys.path.append("../python2")
from script2 import dbServer
def main():
cursor = dbServer()
print(cursor.count())
if __name__ == '__main__':
main()
[root@server Test]# cat python2/script2.py
#! /usr/bin/python
from pymongo import MongoClient
def connectToMongoDB():
global db
try:
conn = MongoClient("myserver.com")
db = conn.CMDB
except Exception as e:
print("nUnable to fetch details from MongoDB..!!!n%sn" % e)
sys.exit()
def dbServer():
connectToMongoDB()
collection = db.dbServer
cursor = collection.find()
return cursor
Выполнение:
[root@server playbook]# ansible-playbook -i ../hosts playbook.yml -e "host=localhost"
PLAY [localhost] ****************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [localhost]
TASK [Connect to MongoDB] *******************************************************************************************
changed: [localhost]
PLAY RECAP **********************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@server playbook]# ansible-playbook -i ../hosts playbook.yml -e "host=myremote"
PLAY [remote_server] ************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [myremote]
TASK [check ping status of P10 systems] *****************************************************************************
fatal: [myremote]: FAILED! => {"changed": true, "msg": "non-zero return
code", "rc": 1, "stderr": "Shared connection to myremote closed.rn",
"stderr_lines": ["Shared connection to myremote closed."], "stdout":
"Traceback (most recent call last):rn File
"/root/.ansible/tmp/ansible-tmp-1602453181.740341-
25196530470896/script1.py", line 8, in <module>rn from script2
import dbServerrnModuleNotFoundError: No module named 'script2'rn",
"stdout_lines": ["Traceback (most recent call last):", " File
"/root/.ansible/tmp/ansible-tmp-1602453181.740341-
25196530470896/script1.py", line 8, in <module>", " from script2
import dbServer", "ModuleNotFoundError: No module named 'script2'"]}
PLAY RECAP **********************************************************************************************************
myremote : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Пожалуйста, помогите, как я могу скопировать свой модуль на удаленный сервер. Мне нужно, чтобы это работало и в AWX.
Ответ №1:
Как описано в script
документе модуля: локальный скрипт по пути будет передан на удаленный узел, а затем выполнен.
Никаких импортированных файлов в скрипте не будет, вы должны скопировать их перед удалением с помощью модуля copy
.
Пример (при необходимости адаптируйте режимы доступа и путь) :
- hosts: "{{ host }}"
gather_facts: yes
become: yes
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Create directory
copy:
path: /tmp/python1
state: directory
mode: 0755
- name: Copy scripts
copy:
src: ../python1
dest: /tmp/python1
- name: Connect to MongoDB
script: ../python1/script1.py
args:
chdir: /tmp/python1
executable: python3
Однако обычно предпочтительнее писать модули Ansible, а не запускать скрипты.
Ваш скрипт работает локально, потому что все необходимые импортированные файлы уже существуют
Комментарии:
1. Большое вам спасибо! Это решило мою проблему. Что вы подразумеваете под «обычно предпочтительнее писать модули Ansible, а не запускать скрипты». Как я могу это сделать в моем случае?