Ansible не удалось запустить модуль оболочки в папке sbin - PullRequest
2 голосов
/ 26 апреля 2020

Я запустил Ansible Playbook на указанном c хосте:

Когда я выполняю, например, команду iptables -L из Ansible Я получил эту ошибку:

changed: [host] => {"changed": true, "cmd": "iptables -L", "delta": "0:00:00.018402", "end": "2020-04-26 09:33:11.274857", "failed_when_result": false, "msg": "non-zero return code", "rc": 127, "start": "2020-04-26 09:33:11.256455", "stderr": "/bin/sh: iptables: command not found", "stderr_lines": ["/bin/sh: iptables: command not found"], "stdout": "", "stdout_lines": []}

Пример для playbook:

---
- hosts: all
  gather_facts: no
  tasks:
    - name: ls
      shell: tuned -v
      args:
         executable: /usr/sbin

    - name: iptables flush filter
      iptables:
        chain: "{{ item }}"
        flush: yes
      with_items:  [ 'INPUT', 'FORWARD', 'OUTPUT' ]

    - name: Get iptables rules | No resilience comment
      command: iptables -L
      become: yes
      args:
        executable: /sbin

Файл инвентаризации:

[hosts]
host
[all:vars]
ansible_user=ansible_user
ansible_become_user=root
ansible_ssh_pass=pass
ansible_become=yes

, но iptables установлен на машине. Я проверяю больше команд и получаю, что все команды в папке /sbin не найдены. В чем причина ?! спасибо за помощь

1 Ответ

1 голос
/ 26 апреля 2020

получил, что все команды в папке / sbin не найдены. Что причина

Обычная причина $PATH переменная, которая не включает /sbin местоположение. Самое простое решение - использовать полный путь к бинарному файлу, который вы хотите запустить, поэтому вместо попытки вызвать iptables вам нужно использовать /sbin/iptables.

В качестве альтернативы, которое может выглядеть как лучшее решение, так как оно не требует от вас жестких кодов путей или редактирования чего-либо, вы можете установить собственный $PATH для всей пьесы, как описано в Ansible FAQ :

environment:
  PATH: "{{ ansible_env.PATH }}:/thingy/bin"
  OTHER_ENV_VAR: its_new_value

Обратите внимание, что в приведенном выше примере добавляется /thingy/bin путь к существующему значению $PATH. Вы можете сначала добавить его или полностью заменить существующий PATH, если это необходимо. Также обратите внимание, что ansible_env обычно заполняется сбором фактов (поэтому вы не должны его отключать), и значение переменных зависит от пользователя, который выполнил действие сбора. Если вы измените remote_user или become_user, вы можете использовать неправильные / разные значения для этих переменных.

...