소개
이 랩에서는 Ansible Script 모듈을 사용하여 원격 호스트에서 사용자 지정 스크립트를 실행하는 방법을 배우게 됩니다. Script 모듈을 사용하면 대상 호스트에서 모든 프로그래밍 언어로 작성된 스크립트를 실행할 수 있으므로 자동화 작업에서 유연성과 사용자 지정 옵션을 제공합니다.
이 랩에서는 Ansible Script 모듈을 사용하여 원격 호스트에서 사용자 지정 스크립트를 실행하는 방법을 배우게 됩니다. Script 모듈을 사용하면 대상 호스트에서 모든 프로그래밍 언어로 작성된 스크립트를 실행할 수 있으므로 자동화 작업에서 유연성과 사용자 지정 옵션을 제공합니다.
이 단계에서는 Ansible Script 모듈을 사용하여 원격 호스트에서 간단한 스크립트를 실행합니다.
먼저, /home/labex/project/script-module-playbook.yaml이라는 새 Ansible 플레이북 파일을 생성하고 텍스트 편집기에서 엽니다.
플레이북 파일에 다음 내용을 추가합니다.
- hosts: localhost
tasks:
- name: Execute a simple script
script: /home/labex/project/simple_script.sh
register: script_output
- name: Display script output
debug:
var: script_output.stdout_lines
hosts: 플레이북을 실행할 대상 호스트를 지정합니다. 이 경우 대상 호스트가 "localhost"이므로 플레이북은 로컬 호스트에서 실행됩니다.tasks: 실행할 작업 목록입니다.name: 작업의 목적을 식별하는 작업에 대한 설명적인 이름입니다.script: 작업이 실행하는 실제 명령입니다. Ansible 에게 대상 호스트의 "/home/labex/project/" 디렉토리에 있는 "simple_script.sh"라는 스크립트를 실행하도록 지시합니다.register: 플레이북에서 나중에 사용하기 위해 script_output 변수에 스크립트의 출력을 등록합니다.debug: 디버깅 정보를 인쇄하는 데 사용되는 Ansible 모듈입니다.var: 이전 작업에서 스크립트의 표준 출력을 표시하는 debug 모듈의 매개변수입니다. script_output.stdout_lines 는 스크립트 출력의 각 줄을 포함합니다.요약하면, 이 플레이북의 주요 목적은 로컬 호스트에서 스크립트를 실행하고 실행 후 스크립트의 표준 출력을 표시하는 것입니다. script_output 등록 변수는 스크립트의 출력을 포함하며, 이는 Debug 모듈을 사용하여 인쇄됩니다.
그런 다음, /home/labex/project/simple_script.sh라는 간단한 스크립트 파일을 다음 내용으로 생성합니다.
#!/bin/bash
echo "This is a simple script."
스크립트 파일이 실행 가능하도록 (chmod +x simple_script.sh) 하고 플레이북에 지정된 /home/labex/project/ 디렉토리에 스크립트 파일을 배치합니다.
마지막으로, 다음 명령으로 플레이북을 실행합니다.
chmod +x simple_script.sh
ansible-playbook script-module-playbook.yaml
플레이북 실행 출력에 표시된 스크립트의 출력을 확인합니다.
예시 출력:
...
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Execute a simple script] *************************************************
changed: [localhost]
TASK [Display script output] ***************************************************
ok: [localhost] => {
"script_output.stdout_lines": [
"This is a simple script."
]
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
여기서 "This is a simple script."는 simple_script.sh 스크립트의 출력입니다.
이 단계에서는 Ansible 플레이북에서 Script 모듈을 사용하여 실행되는 스크립트로 변수를 전달하는 방법을 배우게 됩니다.
먼저, 기존 플레이북 파일의 모든 내용을 제거하고 플레이북 파일에 다음 내용을 추가하여 수정합니다.
- hosts: localhost
tasks:
- name: Execute script with a variable
script: /home/labex/project/var_script.sh "{{ message }}"
register: variable_script_output
- name: Display variable script output
debug:
var: variable_script_output.stdout_lines
script: 작업이 실행할 실제 명령입니다. 그리고 {{ message }}는 스크립트로 전달되는 변수입니다. 이중 중괄호는 이것이 Ansible 변수임을 나타내며, 해당 값은 실행 중에 동적으로 대체됩니다.register: 스크립트의 출력을 플레이북에서 나중에 사용하기 위해 "variable_script_output" 변수에 등록합니다.debug: 디버깅 정보를 인쇄하는 데 사용되는 Ansible 모듈입니다.var: debug 모듈의 이 매개변수는 이전 작업에서 스크립트의 표준 출력을 표시합니다. variable_script_output.stdout_lines 는 스크립트 출력의 각 줄을 포함합니다.요약하면, 이 플레이북은 로컬 호스트에서 스크립트를 실행하고 "message"라는 변수를 스크립트에 전달합니다. 스크립트의 출력은 variable_script_output 변수에 등록된 다음 debug 모듈을 사용하여 인쇄됩니다.
그런 다음, /home/labex/project/var_script.sh라는 간단한 스크립트 파일을 다음 내용으로 생성합니다.
#!/bin/bash
echo $1
스크립트 파일이 실행 가능하도록 (chmod +x var_script.sh) 하고 플레이북에 지정된 /home/labex/project/ 디렉토리에 스크립트 파일을 배치합니다.
마지막으로, 플레이북을 실행할 때 -e 옵션을 사용하여 message 변수를 추가 변수로 전달합니다.
chmod +x var_script.sh
ansible-playbook script-module-playbook.yaml -e "message=Hello,Ansible"
제공된 메시지로 스크립트의 출력을 확인합니다.
예시 출력:
...
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Execute script with a variable] ******************************************
changed: [localhost]
TASK [Display variable script output] ******************************************
ok: [localhost] => {
"variable_script_output.stdout_lines": [
"Hello,Ansible"
]
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
여기서 "Hello,Ansible"은 simple_script.sh 스크립트의 출력입니다.
이 단계에서는 Script 모듈을 사용하여 스크립트를 실행할 때 스크립트 실패를 처리하는 방법을 배우게 됩니다. 실패를 나타내는 0 이 아닌 종료 상태를 반환하는 스크립트의 경우를 처리합니다.
먼저, 기존 플레이북 파일의 모든 내용을 제거하고 플레이북 파일에 다음 내용을 추가하여 수정합니다.
- hosts: localhost
tasks:
- name: Execute a failing script
script: /home/labex/project/failing_script.sh
register: failing_script_output
ignore_errors: yes
- name: Handle script failure
debug:
msg: "The script failed. Performing fallback action."
when: failing_script_output.failed
script: 작업이 실행할 실제 명령입니다.register: 스크립트의 출력을 플레이북에서 나중에 사용하기 위해 "failing_script_output" 변수에 등록합니다.ignore_errors: 이 매개변수는 이 스크립트 작업이 실패하더라도 Ansible 이 후속 작업을 계속 실행하도록 허용하기 위해 yes로 설정됩니다. 실패는 failing_script_output 변수에 기록됩니다.debug: 디버깅 정보를 인쇄하는 데 사용되는 Ansible 모듈입니다.msg: debug 모듈의 이 매개변수는 스크립트가 실패했음을 나타내는 메시지를 인쇄합니다. 이 작업은 이전 작업 (failing_script_output) 이 실패한 경우에만 실행됩니다.when: 이 조건은 첫 번째 작업의 스크립트가 실패한 경우에만 이 작업이 실행되도록 합니다. 스크립트가 성공하면 이 작업은 건너뜁니다.요약하면, 이 플레이북은 실패할 수 있는 스크립트를 실행하려고 시도합니다. 스크립트가 실패하면 플레이북은 디버그 메시지를 인쇄하고 대체 작업을 수행하여 실패를 처리합니다. ignore_errors: yes 매개변수를 사용하면 스크립트가 실패하더라도 플레이북이 계속 실행될 수 있으며, when: failing_script_output.failed 조건은 필요한 경우에만 처리 작업이 실행되도록 합니다.
그런 다음, /home/labex/project/failing_script.sh라는 실패하는 스크립트 파일을 다음 내용으로 생성합니다.
#!/bin/bash
exit 1
스크립트 파일이 실행 가능하도록 (chmod +x failing_script.sh) 하고 플레이북에 지정된 /home/labex/project/ 디렉토리에 스크립트 파일을 배치합니다.
마지막으로, 플레이북을 실행하고 ignore_errors: yes로 인해 실패하는 스크립트가 실행되지만 무시되는지 확인합니다.
chmod +x failing_script.sh
ansible-playbook script-module-playbook.yaml
플레이북은 실패를 나타내고 대체 작업을 수행하는 디버그 메시지를 표시합니다.
예시 출력:
...
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Execute a failing script] ************************************************
fatal: [localhost]: FAILED! => {"changed": true, "msg": "non-zero return code", "rc": 1, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [Handle script failure] ***************************************************
ok: [localhost] => {
"msg": "The script failed. Performing fallback action."
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
"msg": "The script failed. Performing fallback action."은 failing_script.sh 스크립트가 실행에 실패했음을 나타냅니다.
축하합니다! Ansible Script Module 랩을 성공적으로 완료했습니다. Script 모듈을 사용하여 원격 호스트에서 사용자 지정 스크립트를 실행하고, 스크립트에 변수를 전달하며, 스크립트 실패를 처리하는 방법을 배웠습니다.
Script 모듈은 사용자 지정 스크립트의 기능을 활용하여 자동화 작업에서 뛰어난 유연성과 사용자 지정 옵션을 제공합니다. 그러나 보안 취약점을 방지하기 위해 안전하고 신뢰할 수 있는 스크립트를 작성하고 모든 입력을 검증해야 합니다.
이제 Script 모듈에 대한 이해가 높아졌으므로, Ansible 플레이북에 통합하여 다양한 작업을 자동화하고 보다 고급 자동화 시나리오를 달성할 수 있습니다. Ansible 로 즐거운 스크립팅을 하세요!