Monday, October 7, 2024

[Ansible] Xác định hệ thống chạy /bin/sh hay /bin/bash để chạy lệnh cho remote server

-

Trong hầu hết các hệ thống Linux hiện đại, /bin/sh/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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories