Trong hầu hết các hệ thống Linux hiện đại, /bin/sh
và /bin/bash
đều có sẵn và đều là shell. Tuy nhiên, có thể có sự khác biệt về cách thức cài đặt và sử dụng shell này trên mỗi hệ thống.
Một cách để xác định shell mặc định trên hệ thống của bạn là chạy lệnh sau:
echo $SHELL
Lệnh này sẽ hiển thị đường dẫn đến shell mặc định trên hệ thống của bạn.
Ngoài ra, để biết chắc chắn shell nào được sử dụng trong một tác vụ cụ thể, bạn có thể xem xét mã lệnh của tác vụ đó để xác định loại shell được sử dụng.
Ví dụ tôi có 1 playbook với 2 task như sau:
- name: Add JAVA_HOME to ~/.bashrc
lineinfile:
path: ~/.bashrc
line: 'export JAVA_HOME=/path/to/java'
create: yes
- name: Reload environment variables
shell: source ~/.bashrc
Và kết quả gây lỗi khi tôi chạy playbook này.
PLAY [Deploy monitor] ***************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************************************************************************
ok: [vnpt-prometheus]
TASK [demo : Add JAVA_HOME to ~/.bashrc] ********************************************************************************************************************************************************************************
ok: [vnpt-prometheus]
TASK [demo : Reload environment variables] ******************************************************************************************************************************************************************************
fatal: [vnpt-prometheus]: FAILED! => {"changed": true, "cmd": "source ~/.bashrc", "delta": "0:00:00.003677", "end": "2023-03-15 02:41:58.572593", "msg": "non-zero return code", "rc": 127, "start": "2023-03-15 02:41:58.568916", "stderr": "/bin/sh: 1: source: not found", "stderr_lines": ["/bin/sh: 1: source: not found"], "stdout": "", "stdout_lines": []}
PLAY RECAP **************************************************************************************************************************************************************************************************************
vnpt-prometheus : ok=2 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Ansible báo lỗi “/bin/sh: 1: source: not found”, lỗi này thường xảy ra vì module shell
của Ansible sử dụng /bin/sh
thay vì /bin/bash
như mặc định trên một số hệ thống. Lệnh source
chỉ có sẵn trên /bin/bash
nên nó không được tìm thấy khi được chạy bằng /bin/sh
.
Để giải quyết lỗi này thì chúng ta sử dụng tham số executable
để chỉ định sử dụng /bin/bash
thay vì /bin/sh
, như vậy kết quả sử lại playbook của mình sẽ như sau:
- name: Add JAVA_HOME to ~/.bashrc
lineinfile:
path: ~/.bashrc
line: 'export JAVA_HOME=/path/to/java'
create: yes
- name: Reload environment variables
shell: source ~/.bashrc
args:
executable: /bin/bash
Và đây là kết quả.
PLAY [Deploy monitor] ***************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************************************************************************
ok: [vnpt-prometheus]
TASK [demo : Add JAVA_HOME to ~/.bashrc] ********************************************************************************************************************************************************************************
ok: [vnpt-prometheus]
TASK [demo : Reload environment variables] ******************************************************************************************************************************************************************************
changed: [vnpt-prometheus]
PLAY RECAP **************************************************************************************************************************************************************************************************************
vnpt-prometheus : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0