介绍
在本实验中,你将学习如何使用 Ansible 的 Script 模块在远程主机上执行自定义脚本。Script 模块允许你在目标主机上运行用任何编程语言编写的脚本,为你的自动化任务提供了灵活性和定制选项。
在本实验中,你将学习如何使用 Ansible 的 Script 模块在远程主机上执行自定义脚本。Script 模块允许你在目标主机上运行用任何编程语言编写的脚本,为你的自动化任务提供了灵活性和定制选项。
在这一步中,你将使用 Ansible 的 Script 模块在远程主机上执行一个简单的脚本。
首先,创建一个新的 Ansible playbook 文件,命名为 /home/labex/project/script-module-playbook.yaml
,并在文本编辑器中打开它。
将以下内容添加到 playbook 文件中:
- 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
:指定运行 playbook 的目标主机。在本例中,playbook 将在本地主机上运行,因为目标主机是 "localhost"。tasks
:这是要运行的任务列表。name
:这是任务的描述性名称,用于标识任务的目的。script
:这是任务实际执行的命令。它指示 Ansible 在目标主机上运行位于 /home/labex/project/
目录下的名为 "simple_script.sh" 的脚本。register
:这将脚本的输出注册到 script_output
变量中,以便稍后在 playbook 中使用。debug
:这是用于打印调试信息的 Ansible 模块。var
:这是 debug 模块的参数,用于显示上一个任务中脚本的标准输出。script_output.stdout_lines
包含脚本输出的每一行。总结来说,这个 playbook 的主要目的是在本地主机上运行一个脚本,并在脚本运行后显示其标准输出。script_output
注册变量包含脚本的输出,然后使用 Debug 模块打印出来。
接下来,创建一个简单的脚本文件,命名为 /home/labex/project/simple_script.sh
,内容如下:
#!/bin/bash
echo "This is a simple script."
确保脚本文件具有可执行权限(chmod +x simple_script.sh
),并将脚本文件放置在 playbook 中指定的 /home/labex/project/
目录下。
最后,使用以下命令运行 playbook:
chmod +x simple_script.sh
ansible-playbook script-module-playbook.yaml
观察 playbook 执行输出中显示的脚本输出。
示例输出:
...
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 playbook 向使用 Script 模块执行的脚本传递变量。
首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:
- 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
中,以便稍后在 playbook 中使用。debug
:这是用于打印调试信息的 Ansible 模块。var
:这是 debug 模块的参数,用于显示上一个任务中脚本的标准输出。variable_script_output.stdout_lines
包含脚本输出的每一行。总结来说,这个 playbook 在本地主机上执行一个脚本,并向脚本传递一个名为 message
的变量。脚本的输出被注册到变量 variable_script_output
中,然后使用 debug 模块打印出来。
接下来,创建一个简单的脚本文件,命名为 /home/labex/project/var_script.sh
,内容如下:
#!/bin/bash
echo $1
确保脚本文件具有可执行权限(chmod +x var_script.sh
),并将脚本文件放置在 playbook 中指定的 /home/labex/project/
目录下。
最后,在运行 playbook 时,通过 -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 模块执行脚本时处理脚本失败的情况。你将处理脚本返回非零退出状态(表示失败)的情况。
首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:
- 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
中,以便稍后在 playbook 中使用。ignore_errors
:此参数设置为 yes
,以允许 Ansible 在脚本任务失败时继续执行后续任务。失败将被记录在 failing_script_output
变量中。debug
:这是用于打印调试信息的 Ansible 模块。msg
:这是 debug 模块的参数,用于打印一条消息,指示脚本已失败。此任务仅在上一任务(failing_script_output
)失败时执行。when
:此条件确保仅在第一个任务中的脚本失败时执行此任务。如果脚本成功,此任务将被跳过。总结来说,这个 playbook 尝试执行一个可能失败的脚本。如果脚本失败,playbook 会通过打印调试消息并执行回退操作来处理失败。ignore_errors: yes
参数允许 playbook 在脚本失败时继续执行,而条件 when: failing_script_output.failed
确保仅在需要时执行处理任务。
接下来,创建一个失败的脚本文件,命名为 /home/labex/project/failing_script.sh
,内容如下:
#!/bin/bash
exit 1
确保脚本文件具有可执行权限(chmod +x failing_script.sh
),并将脚本文件放置在 playbook 中指定的 /home/labex/project/
目录下。
最后,运行 playbook 并观察失败的脚本被执行,但由于 ignore_errors: yes
而被忽略。
chmod +x failing_script.sh
ansible-playbook script-module-playbook.yaml
playbook 将显示一条调试消息,指示失败并执行回退操作。
示例输出:
...
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 模块的实验。你学习了如何使用 Script 模块在远程主机上执行自定义脚本、向脚本传递变量以及处理脚本失败的情况。
Script 模块通过允许你利用自定义脚本的强大功能,为你的自动化任务提供了极大的灵活性和定制选项。然而,请确保编写安全可靠的脚本,并验证所有输入以防止安全漏洞。
现在你已经对 Script 模块有了很好的理解,可以将其集成到你的 Ansible playbook 中,以自动化各种任务并实现更高级的自动化场景。祝你使用 Ansible 编写脚本愉快!