本文主要介绍Ansible的几个命令模块,包括:
script
- 将本地script传送到远程主机之后执行expect
- 执行命令并响应提示telnet
- 执行低级的和脏的telnet命令
script模块
简介
script
模块的作用是将本地script传送到远程主机之后执行- 给定的脚本将通过远程节点上的shell环境进行处理
script
模块在远程系统上不需要python的支持
模块参数
名称 | 必选 | 默认值 | 可选值 | 备注 |
---|---|---|---|---|
chdir(2.4后新增) | no | 运行command命令前先cd到这个目录 | ||
creates | no | 如果这个参数对应的文件存在,就不运行command | ||
decrypt | no | yes |
yes /no |
此选项控制使用保管库的源文件的自动解密 |
free_form | yes | 需要执行脚本的本地文件路径(没有真正的参数为free_form) | ||
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
示例
- 在远程主机上执行脚本
1
2
3
4
5
6
7
8
9
10[root@centos7 ~]# ansible test -m script -a "test.sh chdir=/tmp"
172.20.21.120 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.20.21.120 closed.\r\n",
"stdout": "/tmp\r\n",
"stdout_lines": [
"/tmp"
]
}
注意事项
- 通常来说,使用Ansible模块比推送脚本更好
- 当脚本执行时,ssh连接插件将通过
-tt
强制伪tty
分配。伪ttys
没有stderr通道,所有stderr被发送到标准输出。如果需要标准输出和标准错误分离,请使用到copy
模块。
expect模块(预览版)
简介
expect
模块用于在给的的节点上执行一个命令并响应提示。- 它不会通过shell处理命令,因此不支持像
$HOME
这样的变量和,以及<
,>
,|
,;
和&
等都是无效的。也就是在command
模块中无法使用管道符。
使用要求(在执行模块的主机上)
- python >= 2.6
- pexpect >= 3.3
模块参数
名称 | 必选 | 默认值 | 备注 |
---|---|---|---|
chdir | no | 运行command命令前先cd到这个目录 | |
command | yes | 命令模块执行命令运行 | |
echo | no | 是否回显你的回应字符串 | |
responses | yes | 期望的字符串/正则表达式和字符串的映射来响应。 如果响应是一个列表,则连续的匹配将返回连续的响应。 列表功能是2.1中的新功能。 | |
creates | no | 如果这个参数对应的文件存在,就不运行command | |
removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 | |
timeout | no | 30 | 以秒为单位等待预期时间 |
示例
- 在远程主机上执行脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14- name: Case insensitve password string match
expect:
command: passwd username
responses:
(?i)password: "MySekretPa$$word"
- name: Generic question with multiple different responses
expect:
command: /path/to/custom/command
responses:
Question:
- response1
- response2
- response3
注意事项
- 如果你想通过shell运行一个命令(比如你正在使用
<
,>
,|
等),你必须在命令中指定一个shell,比如/bin/bash -c "/path/to/something | grep else"
。 - 在
responses
下关键是一个python正则表达式匹配,不区分大小写的搜索用前缀?i
。 - 默认情况下,如果多次遇到问题,则会重复其字符串响应。 如果连续问题匹配需要不同的响应,而不是字符串响应,请使用字符串列表作为响应。
expect
模块设计用于简单场景,对于更复杂的需求,应该考虑在shell
或script
模块中使用expect代码
telnet模块(预览版)
简介
expect
模块用于执行一些低级的和脏telnet命令,不通过模块子系统。- 它不会通过shell处理命令,因此不支持像
$HOME
这样的变量和,以及<
,>
,|
,;
和&
等都是无效的。也就是在command
模块中无法使用管道符。
模块参数
名称 | 必选 | 默认值 | 备注 |
---|---|---|---|
command | yes | 在telnet会话中执行的命令 | |
host | no | remote_addr | 要执行命令的主机/目标 |
password | yes | 登录密码 | |
pause | no | 1 | 每发出一个命令之间的暂停秒 |
port | no | 23 | 远程端口 |
prompts | no | [u'$'] |
发送下一个命令之前预期的提示列表 |
timeout | no | 30 | 远程操作超时时间 |
user | no | remote_user | 登录用户 |
示例
- 在远程主机上执行脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22- name: send configuration commands to IOS
telnet:
user: cisco
password: cisco
login_prompt: "Username: "
prompts:
- "[>|#]"
command:
- terminal length 0
- configure terminal
- hostname ios01
- name: run show commands
telnet:
user: cisco
password: cisco
login_prompt: "Username: "
prompts:
- "[>|#]"
command:
- terminal length 0
- show version
注意事项
- 如果你想通过shell运行一个命令(比如你正在使用
<
,>
,|
等),你必须在命令中指定一个shell,比如/bin/bash -c "/path/to/something | grep else"
。 - 在
responses
下关键是一个python正则表达式匹配,不区分大小写的搜索用前缀?i
。 - 默认情况下,如果多次遇到问题,则会重复其字符串响应。 如果连续问题匹配需要不同的响应,而不是字符串响应,请使用字符串列表作为响应。
expect
模块设计用于简单场景,对于更复杂的需求,应该考虑在shell
或script
模块中使用expect代码