【Ansible学习】- 命令相关模块之expect, script, telnet模块

本文主要介绍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模块设计用于简单场景,对于更复杂的需求,应该考虑在shellscript模块中使用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模块设计用于简单场景,对于更复杂的需求,应该考虑在shellscript模块中使用expect代码
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%