Ansible не находит пользовательские модули python на удаленном сервере

#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, а не запускать скрипты». Как я могу это сделать в моем случае?