Ansible command-задача работает в " ошибка формата Exec"

Я написал эту задачу ansible, чтобы запустить процесс на удаленной коробке бродяга. (Ну, на самом деле сам файл ansible намного длиннее, но это репродуктор, который только запускает сценарий запуска.)

---
- hosts: myappname_server
  vars_files:
    - install_myappname_vars.yaml
  gather_facts: false
  sudo: true
  sudo_user: "{{ project_name }}"

  tasks:
  - name: Restart application
    command: "{{ project_target_dir_env }}/run"
    args:
      chdir: "{{ project_target_dir_env }}"

Он работает с этими Варс в Варс файл:

---
project_name: myappname
project_source_dir_files: files/myappname
project_source_dir_env: "{{ project_source_dir_files }}/environment_files"
project_target_root: /home/myappname
project_target_dir_env: "{{ project_target_root }}/bin"

идея в том, чтобы использовать пользователя "myappname" на пульте коробки (правильно псевдонима "myappname_server", другие пьесы наткнулся на это работать нормально) для работы "/домашний/myappname/ОГРН/выполнить" после изменение каталога на "/ home / myappname / bin". Если я делаю это вручную, все работает нормально, т. е. существуют dir, файлы читаются, скрипт работает и т. д. все отлично. Но если я выполняю сценарий, что-то кажется неправильным с генерацией кода выполнения ansible. Это я и мой конфиг надеюсь)? Это возможно?

мне -пппп получить много информации:

monsterkill@monsterkill-ub-dt:~/playbooks$ ansible-playbook install_myappname_restart.yaml -vvvv

PLAY [myappname_server] ********************************************************** 

TASK: [Restart application] *************************************************** 
<vagrant1> ESTABLISH CONNECTION FOR USER: vagrant
<vagrant1> REMOTE_MODULE command chdir=/home/myappname/bin /home/myappname/bin/run
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'mkdir -p /tmp/ansible-tmp-1422343063.07-259463565013754 && chmod a+rx /tmp/ansible-tmp-1422343063.07-259463565013754 && echo /tmp/ansible-tmp-1422343063.07-259463565013754'"]
<vagrant1> PUT /tmp/tmpBduhE7 TO /tmp/ansible-tmp-1422343063.07-259463565013754/command
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'chmod a+r /tmp/ansible-tmp-1422343063.07-259463565013754/command'"]
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', u'/bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=ucmsbsauynfzeeyxwdmgfduwovdneeqg] password: " -u myappname /bin/sh -c '"'"'echo SUDO-SUCCESS-ucmsbsauynfzeeyxwdmgfduwovdneeqg; /usr/bin/python /tmp/ansible-tmp-1422343063.07-259463565013754/command'"'"''']
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'rm -rf /tmp/ansible-tmp-1422343063.07-259463565013754/ >/dev/null 2>&1'"]
failed: [vagrant1] => {"cmd": ["/home/myappname/bin/run"], "failed": true, "rc": 8}
msg: [Errno 8] Exec format error

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/monsterkill/install_myappname_restart.yaml.retry

vagrant1                   : ok=0    changed=0    unreachable=0    failed=1   

Я пробовал такие вещи, как:

  • играть с косая черта после каталога
  • использование с относительными и абсолютными путями на удаленной машине
  • работа с и без sudo и sudo_user в моих задачах

Я знаю, что все другие модули ansible, которые я использую с той же кучей vars из некоторых соседних книг воспроизведения, работают отлично. Также встроенный материал, как группа, пользователь, файл, apt, разархивировать, копировать. Обратите внимание, что некоторые из них также требуют, чтобы материал группы/пользователя был правильным, поэтому я знаю, что все в порядке, как ну.

/ edit: я также знаю, что путь к сценарию запуска правильный, потому что, если я переименую сценарий запуска и запущу playbook, я получу еще одну ошибку ("msg: [Errno 2] нет такого файла или каталога", как ожидалось). Таким образом, он фактически пытается запустить существующий сценарий запуска, но терпит неудачу.

но ничего не работает. Что происходит, что не так с этой последней частью созданного EXEC материала? Спасибо, что уделили мне время.

7
задан SadBunny
13.04.2023 9:27 Количество просмотров материала 3418
Распечатать страницу

3 ответа

Если вы пытаетесь запустить скрипт, проверьте:

  • что он не пропускает строку shebang вверху, например:

    #!/usr/bin/env bash
    
  • , что пользователь ansible будет работать как имеет разрешения на выполнение для него (например, mode 0755)
6
отвечен thenickdude 2023-04-14 17:15

"ошибка формата Exec" означает, просто, что вы попытались выполнить файл, который ядро не распознает как допустимую программу – он находится в неподходящем формате. В этом случае это, кажется, относится к rm на целевом сервере.

Ssh непосредственно на сервер и убедитесь, что rm произведения; использовать file $(which rm) чтобы проверить его формат (сравнить с другими инструментами, такими как mkdir). Сделайте то же самое с /usr/bin/python на всякий случай. Возможно, он был скопирован из другой системы архитектуры или из разные ОС, или просто завалены мусором.

0
отвечен grawity 2023-04-14 19:32

В общем случае, 'ошибка формата exec' в ansible может означать:

  • программа, которую вы дали ansible для выполнения, буквально не является исполняемым файлом.
  • ansible нашел файл, помеченный как исполняемый, который на самом деле не является исполняемым, и попытался его выполнить.

другими словами: это почти всегда означает, что разрешения неверны, но это может произойти в обоих направлениях (непривилегированные или перегруженные файлы могут вызывать ошибки exec по-разному).

лично я обнаружил, что получаю такую ошибку, когда делаю что-то вроде "chmod 777 /etc/ansible/facts/.."по определенным каталогам и так далее.

0
отвечен jayunit100 2023-04-14 21:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх