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 $SHELLLệ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 ~/.bashrcVà 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/bashVà đâ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