Ansible Local Action 模块

AnsibleAnsibleBeginner
立即练习

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

介绍

欢迎来到 Ansible Local Action 模块实验!在本实验中,你将深入学习 Ansible Local Action 模块的使用。Local Action 模块允许你在执行 Ansible 的控制机器上运行任务。这在需要本地执行操作时非常有用,例如执行 shell 命令或运行脚本。

让我们开始吧!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("`Ansible`")) -.-> ansible/AnsibleSetupandConfigurationGroup(["`Ansible Setup and Configuration`"]) ansible(("`Ansible`")) -.-> ansible/ModuleOperationsGroup(["`Module Operations`"]) ansible/AnsibleSetupandConfigurationGroup -.-> ansible/local_action("`Delegate Action Locally`") ansible/ModuleOperationsGroup -.-> ansible/command("`Execute Commands`") ansible/ModuleOperationsGroup -.-> ansible/debug("`Test Output`") ansible/ModuleOperationsGroup -.-> ansible/shell("`Execute Shell Commands`") subgraph Lab Skills ansible/local_action -.-> lab-290189{{"`Ansible Local Action 模块`"}} ansible/command -.-> lab-290189{{"`Ansible Local Action 模块`"}} ansible/debug -.-> lab-290189{{"`Ansible Local Action 模块`"}} ansible/shell -.-> lab-290189{{"`Ansible Local Action 模块`"}} end

在本地执行简单命令

在这一步中,你将学习如何使用 Ansible Local Action 模块在控制机器上执行一个简单的命令。这将帮助你理解该模块的基本用法和语法。

首先,完成 /home/labex/project/execute_local_command.yml 文件。
在 playbook 文件中添加以下内容:

- name: Executing a Simple Command Locally
  gather_facts: false
  hosts: localhost

  tasks:
    - name: Print a message locally
      local_action:
        module: command
        cmd: echo "Hello, World!"
      register: result

    - name: Debug the output
      debug:
        var: result.stdout
  • gather_facts:指定 Ansible 是否应收集目标主机的事实信息。在这里设置为 false,表示不收集事实信息。
  • hosts:指定运行 playbook 的目标主机。在这里,目标主机是 localhost,因此 playbook 将在本地主机上运行。
  • tasks:这是要执行的任务列表。
  • local_action:表示操作应在运行 Ansible 的控制机器上本地执行。
  • module:指定用于操作的 Ansible 模块。在这里使用的是 command 模块。
  • cmd:这是要执行的实际命令。在这里是 shell 命令 echo "Hello, World!",它将在控制台打印消息 "Hello, World!"。
  • register:将命令的输出注册到 result 变量中,以便在 playbook 中后续使用。
  • debug:这是用于打印调试信息的 Ansible 模块。
  • var:这是 debug 模块的参数,用于指定要调试的变量。在这里是 result.stdout,它包含上一个任务中执行的命令的标准输出。

总结来说,这个 playbook 在控制机器上本地执行了一个简单的命令 echo "Hello, World!",注册了输出,然后使用 debug 模块打印输出。

接下来,显示 Ansible playbook 中命令的输出。

ansible-playbook /home/labex/project/execute_local_command.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Local Action Module Challenge] *******************************************

TASK [Print a message locally] *************************************************
changed: [localhost]

TASK [Debug the output] ********************************************************
ok: [localhost] => {
    "result.stdout": "Hello, World!"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在这里,"result.stdout": "Hello, World!"echo "Hello, World!" 命令的输出。

使用变量替换执行命令

在这一步中,你将通过引入变量替换来加深对 Local Action 模块的理解。这将允许你根据 playbook 中定义的变量动态更改要执行的命令。

首先,完成 /home/labex/project/execute_command_with_variable_substitution.yml 文件。
在 playbook 文件中添加以下内容:

- name: Executing a Command with Variable Substitution
  gather_facts: false
  hosts: localhost
  vars:
    message: "Hello, Ansible!"

  tasks:
    - name: Print a message with variable substitution
      local_action:
        module: command
        cmd: echo "{{ message }}"
      register: result

    - name: Debug the output
      debug:
        var: result.stdout
  • vars:此部分用于定义变量。在这个 playbook 中,它定义了一个名为 message 的变量,其值为 "Hello, Ansible!"
  • local_action:表示操作应在运行 Ansible 的控制机器上本地执行。
  • module:指定用于操作的 Ansible 模块。在这里使用的是 command 模块。
  • cmd:这是要执行的实际命令。在这里是 shell 命令 echo "{{ message }}",其中 {{ message }} 会被替换为之前定义的 message 变量的值。
  • register:将命令的输出注册到 result 变量中,以便在 playbook 中后续使用。
  • debug:这是用于打印调试信息的 Ansible 模块。
  • var:这是 debug 模块的参数,用于指定要调试的变量。在这里是 result.stdout,它包含上一个任务中执行的命令的标准输出。

总结来说,这个 playbook 在控制机器上本地执行了命令 echo "{{ message }}",其中 {{ message }} 被替换为 vars 部分中定义的 message 变量的值。它注册了命令的输出,然后使用 debug 模块打印输出。

接下来,显示 Ansible playbook 中命令的输出。

ansible-playbook /home/labex/project/execute_command_with_variable_substitution.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Local Action Module Challenge] *******************************************

TASK [Print a message with variable substitution] ******************************
changed: [localhost]

TASK [Debug the output] ********************************************************
ok: [localhost] => {
    "result.stdout": "Hello, Ansible!"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在这里,"result.stdout": "Hello, Ansible!"echo "{{ message }}" 命令的输出。

执行复杂的本地操作

在这一步中,你将探索 Ansible Local Action 模块的更复杂用法。你将在本地执行一个 shell 脚本,并向脚本传递参数。

首先,完成 /home/labex/project/execute_complex_local_action.yml 文件。
在 playbook 文件中添加以下内容:

- name: Executing a Complex Local Action
  gather_facts: false
  hosts: localhost

  tasks:
    - name: Execute a shell script with arguments
      local_action:
        module: shell
        cmd: ./script.sh 5 7
      register: result

    - name: Debug the output
      debug:
        var: result.stdout
  • local_action:表示操作应在运行 Ansible 的控制机器上本地执行。
  • module:指定用于操作的 Ansible 模块。在这里使用的是 shell 模块。
  • cmd:这是要执行的实际 shell 命令。在这里是 ./script.sh 5 7,它执行一个名为 script.sh 的 shell 脚本,并传递参数 57
  • register:将命令的输出注册到 result 变量中,以便在 playbook 中后续使用。
  • debug:这是用于打印调试信息的 Ansible 模块。
  • var:这是 debug 模块的参数,用于指定要调试的变量。在这里是 result.stdout,它包含上一个任务中执行的命令的标准输出。

总结来说,这个 playbook 在控制机器上本地执行了一个 shell 脚本 script.sh,并传递了参数 57。它注册了脚本的输出,然后使用 debug 模块打印输出。

提示: 我们已经为你准备好了这个 shell 脚本,它位于 /home/labex/project/ 目录下,名为 script.sh。该脚本的功能是计算两个参数的和。

接下来,显示 Ansible playbook 中命令的输出。

ansible-playbook /home/labex/project/execute_complex_local_action.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Local Action Module Challenge] *******************************************

TASK [Execute a shell script with arguments] ***********************************
changed: [localhost]

TASK [Debug the output] ********************************************************
ok: [localhost] => {
    "result.stdout": "The sum of 5 and 7 is 12."
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在这里,"result.stdout": "The sum of 5 and 7 is 12."./script.sh 5 7 脚本的输出。

总结

恭喜你完成了 Ansible Local Action 模块实验!在本实验中,你学习了如何使用 Ansible Local Action 模块在本地执行命令和脚本。从简单的命令执行开始,你逐步掌握了变量替换以及执行带参数的复杂 shell 脚本。

通过完成本实验,你获得了利用 Local Action 模块在控制机器上执行任务的宝贵经验。继续探索 Ansible 及其模块,进一步提升你的自动化能力。

祝你自动化愉快!

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