Ansible 无法 运行 shell sbin 文件夹上的模块
Ansible failed to run shell module on sbin folder
我 运行 特定主机上的 Ansible Playbook:
当我从 Ansible 执行例如 iptables -L
命令时,我得到了这个错误:
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": []}
剧本示例:
---
- 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
文件夹中的所有命令都未找到。
什么原因?!
感谢您的帮助
got that all the commands in /sbin folder not found. What the reason
通常原因 $PATH
变量,不包括 /sbin
位置。最简单的解决方案是使用您想要 运行 的二进制文件的完整路径,因此您需要使用 /sbin/iptables
而不是尝试调用 iptables
。
或者,这可能看起来是更好的解决方案,因为它不需要您硬编码路径或编辑任何内容,您可以为整个剧本设置自己的 $PATH
,如记录 in 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
,您最终可能会为这些变量使用 wrong/different 值。
我 运行 特定主机上的 Ansible Playbook:
当我从 Ansible 执行例如 iptables -L
命令时,我得到了这个错误:
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": []}
剧本示例:
---
- 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
文件夹中的所有命令都未找到。
什么原因?!
感谢您的帮助
got that all the commands in /sbin folder not found. What the reason
通常原因 $PATH
变量,不包括 /sbin
位置。最简单的解决方案是使用您想要 运行 的二进制文件的完整路径,因此您需要使用 /sbin/iptables
而不是尝试调用 iptables
。
或者,这可能看起来是更好的解决方案,因为它不需要您硬编码路径或编辑任何内容,您可以为整个剧本设置自己的 $PATH
,如记录 in 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
,您最终可能会为这些变量使用 wrong/different 值。