Невозможно выполнить команду npm в контейнере ansible awx_task - PullRequest
0 голосов
/ 17 января 2020

Я уже некоторое время использую ядро ​​ansible и расширяю свою команду, поэтому потребность в ansible awx стала немного более насущной. Я работаю над этим уже неделю, и я думаю, что пришло время обратиться за помощью.

У нас был процесс замены baseurl angularjs приложений на некоторую переменную, используя ansible и установите некоторые параметры перед тем, как мы скомпилируем их (в настоящее время мы думаем о другом способе сделать это с помощью сервера сборки, такого как TeamCity, но не сейчас, мы пытаемся работать с ansible awx).

ansible core извлекает код из версии ветви git, заменяет переменные и упаковывает его в s3 et c.

Зная, что хост ansible awx был настроен с nvm, затем был установлен узел и .nvm сопоставлен с /home/awx/.nvm Я также сопоставил bashr c с /home/awx/.bashrc. Когда я захожу в контейнер awx_task docker exec -it awx_task /bin/bash, я вижу следующее:

[root@awx ~]# npm --version
 5.5.1
[root@awx ~]# echo $PATH /home/awx/.nvm/versions/node/v8.9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@awx ~]# env
NVM_DIR=/home/awx/.nvm
LANG=en_US.UTF-8
HOSTNAME=awx
NVM_CD_FLAGS=
DO_ANSIBLE_HOME=/opt/do_ansible_awx_home
PWD=/home/awx
HOME=/home/awx
affinity:container==eb57afe832eaa32472812d0cd8b614be6df213d8e866f1d7b04dfe109a887e44
TERM=xterm
NVM_BIN=/home/awx/.nvm/versions/node/v8.9.3/bin
SHLVL=1
LANGUAGE=en_US:en
PATH=/home/awx/.nvm/versions/node/v8.9.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin                                                                                                                                      

LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/env

[root@awx ~]# cat /home/awx/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

Все сопоставления томов и т. Д. c были выполнены с шаблонами ролей установщика и задачами, поэтому приведенный выше вывод остается тем же после несколько docker перезапустите и переустановите, запустив программу установки ansible awx. Но во время исполнения пьесы, которая использует npm, кажется, что она имеет другую env PATH: /var/lib/awx/venv/ansible/bin:/var/lib/awx/venv/awx/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

AWX job execution screenshot

На данный момент , Я не уверен, что мне не удалось правильно настроить путь или другие контейнеры, такие как awx_web, также должны быть настроены et c.

Я также заметил env NVM_BIN и изменил npm playbook, добавив путь к исполняемому файлу npm:

  - name: Running install to build npm modules
    npm:
      path: "{{ bps_git_checkout_folder }}"
      executable: "{{ lookup('env','NVM_BIN') }}/npm"

, и он даже не отображается во время выполнение, таким образом, указывает на различные загружаемые переменные path и env.

enter image description here

Буду признателен, если вы сможете пролить свет на то, что я делаю неправильно.

Заранее спасибо

РЕДАКТИРОВАТЬ : После реализации предложения @sergei я использовал дополнительные переменные npm_bin: /home/awx/.nvm/versions/node/v8.9.3/bin

Я изменил задачу, чтобы посмотреть как:

   - name: Running install to build npm modules
     npm:
       path: "{{ bps_git_checkout_folder }}"
       executable: "{{ npm_bin }}/npm"

Но он привел к такому результату:

 <127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: root
 <127.0.0.1> EXEC /bin/sh -c 'echo ~root && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209 `" && echo 
 ansible-tmp-1579790680.4419668-165048670233209="` echo /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209 `" ) && 
 sleep 0'
 Using module file /usr/lib/python3.6/site-packages/ansible/modules/packaging/language/npm.py
 <127.0.0.1> PUT /var/lib/awx/.ansible/tmp/ansible-local-10173xtu81x_o/tmpd40htayd TO /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py
 <127.0.0.1> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/ /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c '/usr/libexec/platform-python /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/ > /dev/null 2>&1 && sleep 0'
 The full traceback is:
 Traceback (most recent call last):
 File "/root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py", line 114, in <module>
 _ansiballz_main()
 File "/root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py", line 106, in _ansiballz_main
 invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
 File "/root/.ansible/tmp/ansible-tmp-1579790680.4419668-165048670233209/AnsiballZ_npm.py", line 49, in invoke_module
imp.load_module('__main__', mod, module, MOD_DESC)
 File "/usr/lib64/python3.6/imp.py", line 235, in load_module
 return load_source(name, filename, file)
 File "/usr/lib64/python3.6/imp.py", line 170, in load_source
 module = _exec(spec, sys.modules[name])
 File "<frozen importlib._bootstrap>", line 618, in _exec
 File "<frozen importlib._bootstrap…
 PLAY RECAP 
 *********************************************************************
 localhost                  : ok=5    changed=4    unreachable=0 failed=1    skipped=0    rescued=0    ignored=0   

Я также попытался использовать модуль оболочки напрямую со следующим:

  - name: Running npm install 
    shell: "{{ npm_bin }}/npm install"
    args:
    chdir: "{{ bps_git_checkout_folder }}"

Это имеет вместо этого произвел:

 <127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: root
 <127.0.0.1> EXEC /bin/sh -c 'echo ~root && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218 `" && echo 
 ansible-tmp-1579791187.453365-253173616238218="` echo /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218 `" ) && 
 sleep 0'
 Using module file /usr/lib/python3.6/site- packages/ansible/modules/commands/command.py
 <127.0.0.1> PUT /var/lib/awx/.ansible/tmp/ansible-local-10395h1ga8fw3/tmpepeig729 TO /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218/AnsiballZ_command.py
 <127.0.0.1> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218/ /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218/AnsiballZ_command.py && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c '/usr/libexec/platform-python /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218/AnsiballZ_command.py && sleep 0'
 <127.0.0.1> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1579791187.453365-253173616238218/ > /dev/null 2>&1 && sleep 0'
fatal: [localhost]: FAILED! => {
    "changed": true,
    "cmd": "/home/awx/.nvm/versions/node/v8.9.3/bin/npm install",
    "delta": "0:00:00.005528",
    "end": "2020-01-23 14:53:07.928843",
    "invocation": {
        "module_args": {
            "_raw_params": "/home/awx/.nvm/versions/node/v8.9.3/bin/npm install",
            "_uses_shell": true,
            "argv": null,
            "chdir": "/opt/do_ansible_awx_home/gh/deployments/sandbox/bps",
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "warn": true
        }
     },
     "msg": "non-zero return code",
     "rc": 127,
     …
     PLAY RECAP 
   *********************************************************************
   localhost                  : ok=5    changed=4    unreachable=0 failed=1    skipped=0    rescued=0    ignored=0   

Не совсем понял, что здесь не так. Благодарен, если кто-нибудь может поделиться некоторыми огнями на этом.

1 Ответ

0 голосов
/ 23 января 2020

Где сидят ваши посылки? В хосте или внутри контейнера? Все выполнение находится в контейнере задач.

Если вы npm файлы сидите на «хосте», а не в контейнере, то вы должны обратиться к хосту, на котором сидят контейнеры. обратитесь к пути.

...