如何使用 Ansible 命令模块在目标主机上运行命令

AnsibleAnsibleBeginner
立即练习

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

简介

Ansible 是一个强大的 IT 自动化工具,可简化对远程系统的管理。在本教程中,我们将探讨 Ansible 命令模块,它允许你在目标主机上执行命令。你将学习命令执行的基础知识,以及增强 Ansible 工作流程的高级技术。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible/ModuleOperationsGroup -.-> ansible/command("Execute Commands") ansible/ModuleOperationsGroup -.-> ansible/script("Run Scripts") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/command -.-> lab-415740{{"如何使用 Ansible 命令模块在目标主机上运行命令"}} ansible/script -.-> lab-415740{{"如何使用 Ansible 命令模块在目标主机上运行命令"}} ansible/shell -.-> lab-415740{{"如何使用 Ansible 命令模块在目标主机上运行命令"}} ansible/playbook -.-> lab-415740{{"如何使用 Ansible 命令模块在目标主机上运行命令"}} end

理解 Ansible 命令模块

Ansible 是一个强大的开源自动化工具,可让你跨多个主机管理和配置基础设施。Ansible 命令模块是 Ansible 的核心模块之一,它使你能够在远程主机上执行任意命令。

Ansible 命令模块提供了一种简单直接的方式在目标主机上运行命令。它允许你在远程系统上执行 shell 命令、脚本或任何其他可执行文件。当你需要执行临时任务、排查问题或在基础设施上执行自定义命令时,此模块特别有用。

要使用 Ansible 命令模块,你需要在 Ansible 剧本或临时命令中定义 command 参数。command 参数指定你要在远程主机上执行的命令。例如:

- name: 在远程主机上执行命令
  command: uptime
  register: uptime_result
  become: yes

在此示例中,command 参数设置为 uptime,这将在远程主机上执行 uptime 命令。register 参数用于捕获命令的输出,become 参数设置为 yes 以使用提升的权限运行命令(如果需要)。

Ansible 命令模块还支持各种选项,例如:

  • creates:指定在运行命令之前必须存在的文件。
  • removes:指定在运行命令之前不能存在的文件。
  • chdir:在执行命令之前将当前工作目录更改为指定的路径。
  • stdin:通过标准输入将指定的字符串传递给命令。
  • warn:控制如果命令可能会更改重要文件时是否显示警告。

通过理解 Ansible 命令模块,你可以在远程主机上高效地执行命令、自动化重复任务并简化基础设施管理流程。

在远程主机上执行命令

基本命令执行

要使用 Ansible 命令模块在远程主机上执行命令,你可以使用以下基本语法:

- name: 在远程主机上执行命令
  command: <命令>
  register: <结果变量>
  become: yes

在此示例中,<命令> 是你要在远程主机上执行的实际命令,<结果变量> 是将存储命令输出的变量。become 参数设置为 yes 以使用提升的权限运行命令(如果需要)。

例如,要检查远程主机的运行时间:

- name: 检查远程主机的运行时间
  command: uptime
  register: uptime_result
  become: yes

uptime 命令的输出将存储在 uptime_result 变量中,然后你可以在剧本或临时命令中使用它。

处理命令错误

默认情况下,如果执行的命令返回非零退出代码,Ansible 命令模块将失败。你可以使用 ignore_errors 参数处理命令错误:

- name: 在远程主机上执行命令
  command: <命令>
  register: <结果变量>
  ignore_errors: yes

这将允许剧本即使在命令失败时也继续执行。

捕获命令输出

如前面的示例所示,你可以使用 register 参数捕获命令的输出。输出将存储在指定的变量中,然后你可以在剧本或临时命令中使用它。

例如,要捕获 uptime 命令的输出并打印它:

- name: 检查远程主机的运行时间
  command: uptime
  register: uptime_result
  become: yes

- name: 打印运行时间
  debug:
    msg: "{{ uptime_result.stdout }}"

这将把 uptime 命令的输出打印到控制台。

通过了解使用 Ansible 命令模块在远程主机上执行命令的基础知识,你可以在基础设施中有效地自动化各种任务。

高级命令执行技术

条件命令执行

有时,你可能希望仅在满足特定条件时才执行命令。你可以使用 when 子句在 Ansible 剧本中有条件地执行命令:

- name: 当条件满足时执行命令
  command: <命令>
  when: <条件>
  register: <结果变量>
  become: yes

在此示例中,仅当 <条件> 为真时才会执行 <命令>

例如,仅当系统的可用内存少于 20% 时才执行 free 命令:

- name: 检查可用内存
  command: free -m
  register: memory_result
  become: yes

- name: 当可用内存少于20%时执行命令
  command: <要执行的命令>
  when: (memory_result.stdout_lines[1].split()[3]|int / memory_result.stdout_lines[1].split()[1]|int * 100) < 20
  register: <结果变量>
  become: yes

循环执行命令

你还可以使用循环在单个任务中执行多个命令。为此,Ansible 命令模块支持 loop 参数:

- name: 执行多个命令
  command: "{{ item }}"
  loop:
    - <命令1>
    - <命令2>
    - <命令3>
  register: <结果变量>
  become: yes

在此示例中,指定的命令(<命令1><命令2><命令3>)将逐个执行,输出将存储在 <结果变量> 中。

处理命令超时

默认情况下,Ansible 将无限期等待命令完成。但是,你可以使用 timeout 参数为命令执行设置超时时间:

- name: 执行带超时的命令
  command: <命令>
  timeout: 60
  register: <结果变量>
  become: yes

在此示例中,如果命令执行时间超过 60 秒,它将被终止。

通过掌握这些高级命令执行技术,你可以进一步增强 Ansible 自动化功能,并在基础设施管理中处理各种场景。

总结

本 Ansible 教程提供了一份关于使用命令模块在远程主机上执行命令的全面指南。通过理解基础知识并探索高级技术,你可以利用 Ansible 的功能来简化 IT 操作并提高整个基础设施的效率。