目录
[示例 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.使用creates
和removes
参数:
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