Модули Ansible CloudStack не находят библиотеку Pytho n CloudStack cs

Я пытаюсь использовать Ansible вместе с его модулями CloudStack, например, для создания компьютерного экземпляра у поставщика облачных вычислений, поддерживающего CloudStack (здесь: Exoscale, в данном случае это не должно иметь значения).

тл; др:

Библиотека Python CloudStackcs не найден пользователем ansible:

fatal: [localhost]: FAILED! => {"changed": false, "msg": "python library cs required: pip install cs"}

несмотря на то, что установлен.

Детали:

Мой файл инвентаризации / хоста состоит из одной строки:

localhost ansible_connection=local

Я сейчас запускаю минимальный тестовый playbook play.yml с ansible-playbook play.yml

play.yml Содержание:

---
- hosts: localhost
  become: no
  gather_facts: no

  tasks:
    - name: Include global variables
      include_vars: vars/vars.yml
    - name: Include global secrets
      include_vars: vars/vault.yml

    - name: python version
      command: python --version
      register: python_version

    - name: print python version
      debug:
        msg: "{{ python_version }}"

    - name: manual code execution
      command: python -c "from cs import CloudStack; print(CloudStack)"
      register: cs_output

    - name: print manual code execution
      debug:
        msg: "{{ cs_output }}"

    - name: Create debian instance
      cs_instance:
        api_key: "{{ vault.exoscale.key }}"
        api_secret: "{{ vault.exoscale.secret }}"
        api_url: "{{ exoscale.endpoints.compute }}"
        name: test-vm-1
        iso: Linux Debian 7 64-bit
        hypervisor: VMware

Запуск этого приводит к следующему:

PLAY [localhost] *******************************************************************************************************

TASK [Include global variables] ****************************************************************************************
ok: [localhost]

TASK [Include global secrets] ******************************************************************************************
ok: [localhost]

TASK [print python version] ********************************************************************************************
ok: [localhost] => {
    "msg": {
        "changed": true,
        "cmd": [
            "python",
            "--version"
        ],
        "delta": "0:00:00.014565",
        "end": "2018-04-20 08:14:04.997040",
        "failed": false,
        "rc": 0,
        "start": "2018-04-20 08:14:04.982475",
        "stderr": "Python 2.7.14",
        "stderr_lines": [
            "Python 2.7.14"
        ],
        "stdout": "",
        "stdout_lines": []
    }
}

TASK [manual code execution] *******************************************************************************************
changed: [localhost]

TASK [print manual code execution] *************************************************************************************
ok: [localhost] => {
    "msg": {
        "changed": true,
        "cmd": [
            "python",
            "-c",
            "from cs import CloudStack; print(CloudStack)"
        ],
        "delta": "0:00:00.263650",
        "end": "2018-04-20 08:14:05.687666",
        "failed": false,
        "rc": 0,
        "start": "2018-04-20 08:14:05.424016",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "<class 'cs.client.CloudStack'>",
        "stdout_lines": [
            "<class 'cs.client.CloudStack'>"
        ]
    }
}

TASK [Create debian instance] ******************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "python library cs required: pip install cs"}

PLAY RECAP *************************************************************************************************************
localhost                  : ok=7    changed=2    unreachable=0    failed=1    

which python (Python, установленный вместе с Anaconda, среда conda с именем ansible)

/Users/ccauet/anaconda3/envs/ansible/bin/python

python --version

Python 2.7.14

which ansible (устанавливается через pip в той же среде conda)

/Users/ccauet/anaconda3/envs/ansible/bin/ansible

ansible --version (включая определение используемой версии Python)

ansible 2.5.0
  config file = /Users/ccauet/Repositories/p8/exoscale/ansible.cfg
  configured module search path = [u'/Users/ccauet/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/ccauet/anaconda3/envs/ansible/lib/python2.7/site-packages/ansible
  executable location = /Users/ccauet/anaconda3/envs/ansible/bin/ansible
  python version = 2.7.14 | packaged by conda-forge | (default, Mar 30 2018, 18:21:11) [GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)]

pip freeze

ansible==2.5.0
asn1crypto==0.24.0
bcrypt==3.1.4
certifi==2018.4.16
cffi==1.11.5
chardet==3.0.4
cryptography==2.2.2
cs==2.1.6
enum34==1.1.6
idna==2.6
ipaddress==1.0.22
Jinja2==2.10
MarkupSafe==1.0
paramiko==2.4.1
pyasn1==0.4.2
pycparser==2.18
PyNaCl==1.2.1
PyYAML==3.12
requests==2.18.4
six==1.11.0
urllib3==1.22

Как вы видете cs установлен и может быть вызван вручную внутри playbook. Тем не менее модуль CloudStack не находит библиотеку.

До сих пор пробовал:

  • Протестировано с Python 2.7 и 3.6

Любая помощь приветствуется!

1 ответ

Решение

Это звучит для меня как cs_instance Модуль, возможно, использует системный Python, а не виртуальную среду conda. У меня была эта проблема раньше с другими модулями Ansible, работающими локально.

Вы можете заставить Ansible использовать интерпретатор Python в вашей виртуальной среде Conda, установив ansible_python_interpreter факт в инвентаре localhost, Вы можете сделать это как предварительную задачу, если вы запускаете Ansible в той же среде Conda, в которой вы хотите использовать локальную задачу следующим образом:

---
- hosts: localhost
  become: no
  gather_facts: no

  pre_tasks:

   - name: Get local python interpreter
     command: which python
     register: local_python_interpreter

   - name: Set ansible_python_interpreter to local python interpreter
     set_fact:
       ansible_python_interpreter: "{{ local_python_interpreter.stdout }}"

  tasks:
  ...
Другие вопросы по тегам