Ansible 命令相关模块command, shell, raw, expect, script, telnet[转]
本文主要介绍Ansible的几个命令模块,包括:
command- 在远程节点上执行命令shell- 让远程主机在shell进程下执行命令script- 将本地script传送到远程主机之后执行raw- 执行低级的和脏的SSH命令expect- 执行命令并响应提示telnet- 执行低级的和脏的telnet命令
command模块
简介
command模块用于在给的的节点上运行系统命令,比如echo hello。- 它不会通过shell处理命令,因此不支持像
$HOME这样的变量和,以及<,>,|,;和&等都是无效的。也就是在command模块中无法使用管道符。
模块参数
| 名称 | 必选 | 备注 |
|---|---|---|
| chdir | no | 运行command命令前先cd到这个目录 |
| creates | no | 如果这个参数对应的文件存在,就不运行command |
| free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
| executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
| removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
| stdin(2.4后新增) | no | 将命令的stdin设置为指定的值 |
示例
- 列出指定目录下的文件
[root@centos7 ~]# ansible test -m command -a "ls /root"
172.20.21.120 | SUCCESS | rc=0 >>
anaconda-ks.cfg
test.sh
whoami.rst
[root@centos7 ~]# ansible test -m command -a "ls /root creates=test.sh"
172.20.21.120 | SUCCESS | rc=0 >>
skipped, since test.sh exists
[root@centos7 ~]# ansible test -m command -a "ls /root removes=test.sh1"
172.20.21.120 | SUCCESS | rc=0 >>
skipped, since test.sh1 does not exist
在这个里面,首先更换目录到root目录中,然后查看test.sh是否存在,如果存在,那么命令不会执行;如果不存在,那么执行命令。
在这里也可以看到,命令是必须存在的,但是没有参数名为free_form参数。
- 切换目录执行命令
[root@centos7 ~]# ansible test -m command -a "cat test.sh chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
#!/bin/bash
i=0
echo $((i+1))
[root@centos7 ~]# ansible test -m command -a "sh test.sh chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
1
- 无法使用管道符
[root@centos7 ~]# ansible test -m command -a "ls /root | grep test"
172.20.21.120 | FAILED | rc=2 >>
/root:
anaconda-ks.cfg
test.sh
whoami.rstls: 无法访问|: 没有那个文件或目录
ls: 无法访问grep: 没有那个文件或目录
ls: 无法访问test: 没有那个文件或目录non-zero return code
注意事项
- 若要通过shell运行一个命令,比如
<,>,|等,你实际上需要shell模块。 command模块更安全,因为它不受用户环境的影响- 从版本2.4开始,
executable参数被删除。如果您需要此参数,请改用shell模块。 - 对于Windows节点,请改用
win_command模块。
shell模块
简介
让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。与command模块几乎相同,但在执行命令的时候使用的是/bin/sh。
模块参数
| 名称 | 必选 | 备注 |
|---|---|---|
| chdir | no | 运行command命令前先cd到这个目录 |
| creates | no | 如果这个参数对应的文件存在,就不运行command |
| executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
| free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
| removes | no | 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反 |
| stdin(2.4后新增) | no | 将命令的stdin设置为指定的值 |
示例
- 切换目录,执行命令并保持输出
[root@centos7 ~]# ansible test -m shell -a "sh test.sh > result chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
[root@centos7 ~]# ansible test -m shell -a "cat result chdir=/root"
172.20.21.120 | SUCCESS | rc=0 >>
1
注意事项
- 如果你想安全可靠的执行命令,请使用
command模块,这也是编写playbook的最佳实践。
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参数的作用相反 |
示例
- 在远程主机上执行脚本
[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模块。
raw模块
简介
raw模块主要用于执行一些低级的,脏的SSH命令,而不是通过command模块。raw模块只适用于下列两种场景,第一种情况是在较老的(Python 2.4和之前的版本)主机上,另一种情况是对任何没有安装Python的设备(如路由器)。 在任何其他情况下,使用shell或command模块更为合适。- 就像
script模块一样,raw模块不需要远程系统上的python
模块参数
| 名称 | 必选 | 备注 |
|---|---|---|
| executable | no | 改变用来执行命令的shell,应该是可执行文件的绝对路径。 |
| free_form | yes | 需要执行的脚本(没有真正的参数为free_form) |
示例
- 在远程主机上执行脚本
[root@centos7 ~]# ansible test -m raw -a "pwd"
172.20.21.120 | SUCCESS | rc=0 >>
/root
Shared connection to 172.20.21.120 closed.
注意事项
- 如果要安全可靠地执行命令,最好使用
shell或command模块来代替。 - 如果从playbook中使用raw,则可能需要使用
gather_facts: no禁用事实收集
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 | 以秒为单位等待预期时间 |
示例
- 在远程主机上执行脚本
- 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 | 登录用户 |
示例
- 在远程主机上执行脚本
- 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代码
作者:hoxis
链接:https://www.jianshu.com/p/8661c107448d
來源:简书
Ansible 命令相关模块command, shell, raw, expect, script, telnet[转]的更多相关文章
- ansible的安装及命令相关模块
ansible 第一步:下载epel源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos- ...
- ansible命令执行模块使用
ansible命令执行模块使用 1.命令执行模块-command 在远程节点上运行命令. 命令模块使用命令名称,接上空格-的分割符作为参数使用,但是不支持管道符和变量等,如果要使用这些,那么可以使用s ...
- ansible命令及模块
ping 命令 #测试单个主机 [root@node1 opt]# ansible -m ping 10.0.0.22 #获取多个主机 [root@node1 opt]# ansible 10.0.0 ...
- ansible软件相关模块丶计划任务,剧本
软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...
- ansible 软件相关模块,剧本
软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum 可以解决依赖关系 yum 源配置 使用yum下载时需要先下载epel [epel] name= ...
- 巨蟒python全栈开发-第11阶段 ansible3_1入门四个模块command&shell&script©
大纲 1.系统安装与机器克隆 2.ansible介绍和host-pattern格式 3.command模块 4.shell模块 5.script模块 6.copy模块
- ansible笔记(6):常用模块之命令类模块
ansible笔记():常用模块之命令类模块 command模块 command模块可以帮助我们在远程主机上执行命令 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处 ...
- Ansible4:Ad-hoc与命令执行模块
目录 Ad-hoc 命令说明 后台执行 命令执行模块 command模块 script模块 Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbo ...
- ansible模块command、shell、raw、script
简介 环境: ansible端: ip:192.168.100.129 hostname:node1.lansgg.com client端: ip:192.168.100.131 hostname:v ...
随机推荐
- (转)XSS危害——session劫持
原文地址:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的 ...
- QuotedStr函数
今天学到一个新函数,很有用 QuotedStr(s);// 在s两边加单引号, 这样就不会看着n多的单引号糊涂了...
- java 支付宝即时到帐提交订单dome
package com.tian.batis; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; imp ...
- MVC页面加载会多次请求后台问题
最近调试代码的时候发现有些控制器有代码走两遍的情况,后台发现是前端url或者herf标签导致请求了mvc路由,具体案例如下: 这两种路径为空的时候都会导致请求mvc路由重复请求后台方法
- 阿里 vs. 腾讯,谁的收购更有眼光?
近年来我们国内企业高速发展,各大集团纷纷收购其他公司发展自己,在这么多的集团收购里面尤其以阿里巴巴和腾讯的收购引人注目.在2014年里阿里巴巴先后投资了中信,美国奢侈品电子商务lstdibs,高德,优 ...
- SQL Server 根据关键字和结束符提取字符串子串
/* @info-待截取的字符串 @indexStr-截取子串的起始字符串 @split-截取子串的结束符号 列入依次传入 胸片:正常.心电图:异常,需要注意.血常规检查:正常. 心电图 '.' 返回 ...
- Setting property 'source' to 'org.eclipse.jst.jee.server:web' did not find a matching property原因
这个问题困扰了好久,虽然只是tomcat的一个警告,但强迫症让我总觉得不舒服,搜索了好多文章才找到知乎上一篇处理的最好的.另外:能找谷哥,尽量不要度娘,太浪费时间. 具体操作如下: 默认情况下,ser ...
- 【bzoj4836】二元运算 分治FFT
Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使 ...
- loj #2305. 「NOI2017」游戏
#2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...
- P2252 取石子游戏 威佐夫博弈
$ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...