No menu items!
No menu items!
More

    [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

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email