Ansible Script 模块

AnsibleAnsibleBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 Ansible 的 Script 模块在远程主机上执行自定义脚本。Script 模块允许你在目标主机上运行用任何编程语言编写的脚本,为你的自动化任务提供了灵活性和定制选项。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("`Ansible`")) -.-> ansible/ModuleOperationsGroup(["`Module Operations`"]) ansible/ModuleOperationsGroup -.-> ansible/debug("`Test Output`") ansible/ModuleOperationsGroup -.-> ansible/script("`Run Scripts`") ansible/ModuleOperationsGroup -.-> ansible/shell("`Execute Shell Commands`") subgraph Lab Skills ansible/debug -.-> lab-289411{{"`Ansible Script 模块`"}} ansible/script -.-> lab-289411{{"`Ansible Script 模块`"}} ansible/shell -.-> lab-289411{{"`Ansible Script 模块`"}} end

执行一个简单的脚本

在这一步中,你将使用 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 编写脚本愉快!

您可能感兴趣的其他 Ansible 教程