Ansible——command 模块

目录

基本用法

指定主机

指定用户

指定不同的清单文件

通过sudo执行

使用更多的模块参数

1.使用特定的模块参数,例如chdir:

2.使用creates和removes参数:

creates参数

removes参数

并发控制

详细输出

例外处理

基本语法

常用参数

示例

[示例 1:简单执行命令](#示例 1:简单执行命令)

[示例 2:更改目录后执行命令](#示例 2:更改目录后执行命令)

[示例 3:仅当文件不存在时才创建文件](#示例 3:仅当文件不存在时才创建文件)

[示例 4:仅当文件存在时才删除文件](#示例 4:仅当文件存在时才删除文件)

[完整的 Playbook 示例](#完整的 Playbook 示例)


Ansible的command模块是一个非常基础和常用的模块,可以通过ansible命令结合一些选项来在远程主机上执行命令。与shell模块不同,command模块在执行命令时不会通过shell解释器来执行,因此无法处理像重定向、管道以及环境变量的展开等复杂的shell功能。

  • cmd: 要在远程主机上执行的命令及其参数,是必需参数。
  • chdir: 在执行命令前更改到指定目录。
  • creates: 如果指定的文件存在,则不运行命令。
  • removes: 如果指定的文件不存在,则不运行命令。
  • stdin: 要传递给命令的标准输入。
  • stdin_add_newline : 在传递的 stdin 后添加换行符(默认为 yes)。
  • strip_empty_ends : 删除命令输出中的空行(默认为 yes)。

基本用法

执行单个命令

bash 复制代码
ansible all -m command -a "ls /home"

这里all是指所有主机(可以是Inventory文件中的一个分组),-m选项指定使用command模块,-a选项后面跟的是要执行的命令。

指定主机

指定一个特定的主机或主机组

bash 复制代码
ansible web -m command -a "ls /etc/yum.repos.d/"

这里web是清单(Inventory)文件中的一个主机组。

指定用户

使用特定的用户来执行命令

bash 复制代码
ansible all -m command -a "ls /root" -u root

这里-u选项指定用root用户执行命令。

指定不同的清单文件

使用指定的清单(Inventory)文件

bash 复制代码
   ansible all -i /path/to/inventory_file -m command -a "ls /home"

这里-i选项指定使用特定的Inventory文件。

通过sudo执行

使用become(sudo)来提升权限执行命令

bash 复制代码
ansible all -m command -a "ls /root" --become

这里--become选项是为了在执行命令时提升权限。

使用更多的模块参数

1.使用特定的模块参数,例如chdir
复制代码
   ansible all -m command -a "cmd='ls' chdir=/home"
  • cmd='ls': 表示要执行的命令是ls(列出目录内容)。
  • chdir=/home: 表示在执行ls命令时先切换到/home目录下执行。
2.使用createsremoves参数:
bash 复制代码
   ansible all -m command -a "cmd='touch /tmp/testfile' creates=/tmp/testfile"
  • cmd='touch /tmp/testfile': 表示要执行的命令是touch /tmp/testfile,这个命令会在/tmp目录中创建一个名为testfile的空文件。
  • creates=/tmp/testfile: 表示如果/tmp/testfile文件已经存在,那么就不执行命令。
bash 复制代码
ansible all -m command -a "cmd='rm /tmp/testfile' removes=/tmp/testfile"
  • cmd='rm /tmp/testfile': 表示要执行的命令是rm /tmp/testfile,这个命令会删除/tmp目录中的testfile文件。
  • removes=/tmp/testfile: 表示如果/tmp/testfile文件不存在,那么就不执行命令。

removes参数和creates参数都是用于控制命令是否执行的条件,但二者的逻辑相反。它们主要用于避免重复操作,并确保操作的幂等性。

creates参数

作用:当指定的文件或目录存在时,不执行命令。

使用场景:常用于需要创建文件或目录的操作,确保创建操作不会重复执行。

removes参数

作用:当指定的文件或目录不存在时,不执行命令。

使用场景:常用于需要删除文件或目录的操作,确保删除操作不会重复执行。

并发控制

限制并发执行的任务数

复制代码
   ansible all -m command -a "ls /home" -f 10

这里-f选项用来限制同一时间内并发执行的任务数,默认为5。

详细输出

显示详细信息

bash 复制代码
ansible all -m command -a "ls /home" -v

这里-v选项用来显示详细信息,还可以使用-vv, -vvv等来增加详细级别。

例外处理

忽略某些错误继续执行

bash 复制代码
ansible all -m command -a "ls /nonexistent" --ignore-errors

下面是如何在 Ansible 的 YAML 文件中使用 command 模块的总结和示例。

基本语法

复制代码
- name: 描述任务的名称
  command: <命令以及其参数>

常用参数

  • cmd: (必需)要执行的命令。
  • chdir: 在执行命令前更改的目录。
  • creates: 只有在指定的文件或目录不存在时才执行命令。
  • removes: 只有在指定的文件或目录存在时才执行命令。

示例

示例 1:简单执行命令
复制代码
- name: Echo a message
  command: echo "Hello, World!"
示例 2:更改目录后执行命令
复制代码
- name: List files in the /tmp directory
  command: ls -l
  args:
    chdir: /tmp
示例 3:仅当文件不存在时才创建文件
复制代码
- name: Create a file if it does not exist
  command: touch /tmp/myfile
  args:
    creates: /tmp/myfile
示例 4:仅当文件存在时才删除文件
复制代码
- name: Remove a file if it exists
  command: rm /tmp/myfile
  args:
    removes: /tmp/myfile

完整的 Playbook 示例

这是一个完整的 Ansible Playbook 示例,包含多个使用 command 模块的任务:

复制代码
---
- name: Example Playbook for using command module
  hosts: all
  tasks:
    - name: Echo Hello World
      command: echo "Hello, World!"

    - name: List root directory
      command: ls -l /
      
    - name: Check if /tmp/testfile exists and create if it doesn't
      command: touch /tmp/testfile
      args:
        creates: /tmp/testfile

    - name: Remove /tmp/testfile if exists
      command: rm /tmp/testfile
      args:
        removes: /tmp/testfile
相关推荐
Lovyk3 分钟前
Linux Shell 常用操作与脚本示例详解
linux·运维·服务器
iCan_qi38 分钟前
【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
运维·服务器·macos·minecraft
ezreal_pan3 小时前
Kubernetes 负载均衡现象解析:为何同一批次请求集中于单个 Pod
运维·云原生·k8s·traefik
朱皮皮呀3 小时前
Spring Cloud——服务注册与服务发现原理与实现
运维·spring cloud·eureka·服务发现·php
yuanpan4 小时前
ubuntu系统上的conda虚拟环境导出方便下次安装
linux·ubuntu·conda
云边云科技5 小时前
零售行业新店网络零接触部署场景下,如何选择SDWAN
运维·服务器·网络·人工智能·安全·边缘计算·零售
城管不管5 小时前
Docker核心---数据卷(堵门秘籍)
运维·docker·容器
AOwhisky5 小时前
Linux 文本处理三剑客:awk、grep、sed 完全指南
linux·运维·服务器·网络·云计算·运维开发
wdxylb5 小时前
云原生俱乐部-RH294知识点归纳(1)
云原生·ansible
Gavin_9155 小时前
从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
linux·ruby on rails·开源·debian·ruby·redmine