让我们使用ansible-console

ansible-console的概述

ansible-console命令是在Ansible 2.1版本中新增的,它允许我们以交互式的方式执行之前使用adhoc命令(ansible命令)来完成的任务。
源于https://github.com/dominis/ansible-shell的代码已经合并到Ansible核心中,并将命令名称从ansible-shell改为ansible-console。

开始运行ansible控制台

在中国,将以下内容进行本地化改写,只需要一个选项:

通常,使用ansible-console命令时,需要指定清单文件进行启动。
指定清单文件的选项与ad hoc命令和ansible-playbook命令相同,均为“-i”。
还可以指定其他与ad hoc命令大致相同的选项。例如,指定Ansible Vault密码的“–ask-vault-pass”等。

$ ansible-console -i hosts
Welcome to the ansible console.
Type help or ? to list commands.

user@all (3)[f:5]$

当你启动ansible-console后,会出现一个交互式的shell提示符,格式为user@all (3)[f:5]$。
这个提示符表示”连接的用户@处理对象的组或主机 (处理的主机数量)[f:并行处理的主机数量]”。

目前,库存文件的内容如下,仅用作样例。

[a-group]
a1

[b-group]
b1
b2

模块的执行

执行模块很容易。
例如,输入ping并按回车键,将执行ping模块来处理目标主机。

user@all (3)[f:5]$ ping
b2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
a1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
b1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

需要参数的模块可以像在playbook中一样只用一行指定,但是不需要在模块名称后面加冒号。在Ansible中,也可以使用变量,如下所示的示例。

user@all (3)[f:5]$ copy src=file dest=~/{{ inventory_hostname }}.txt
a1 | SUCCESS => {
    "changed": true,
    "checksum": "7afb6961cef6e8bc0876224c46bc5692e0d25a48",
    "dest": "/home/user/a1.txt",
    "gid": 1000,
    "group": "user",
    "md5sum": "1c3b6b8100773f62601b7b94cf400077",
    "mode": "0664",
    "owner": "user",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 17,
    "src": "/home/user/.ansible/tmp/ansible-tmp-1464266411.86-130941408708345/source",
    "state": "file",
    "uid": 1000
}
b2 | SUCCESS => {
    "changed": true,
    "checksum": "7afb6961cef6e8bc0876224c46bc5692e0d25a48",
    "dest": "/home/user/b2.txt",
    "gid": 1000,
    "group": "user",
    "md5sum": "1c3b6b8100773f62601b7b94cf400077",
    "mode": "0664",
    "owner": "user",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 17,
    "src": "/home/user/.ansible/tmp/ansible-tmp-1464266411.86-11663736480472/source",
    "state": "file",
    "uid": 1000
}
b1 | SUCCESS => {
    "changed": true,
    "checksum": "7afb6961cef6e8bc0876224c46bc5692e0d25a48",
    "dest": "/home/user/b1.txt",
    "gid": 1000,
    "group": "user",
    "md5sum": "1c3b6b8100773f62601b7b94cf400077",
    "mode": "0664",
    "owner": "user",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 17,
    "src": "/home/user/.ansible/tmp/ansible-tmp-1464266411.86-116685457447402/source",
    "state": "file",
    "uid": 1000
}

当然可以使用lookup插件。

user@all (3)[f:5]$ echo {{ lookup('pipe', 'date') }}
a1 | SUCCESS | rc=0 >>
Thu May 26 23:13:02 JST 2016

b1 | SUCCESS | rc=0 >>
Thu May 26 23:13:02 JST 2016

b2 | SUCCESS | rc=0 >>
Thu May 26 23:13:02 JST 2016

在这里使用了echo命令,但如果指定的模块名(※)不存在,则会被视为shell模块的参数。
或者,即使是存在的模块名(※),如果在最前面加上!,也会被视为shell模块的参数。
(※准确来说,是模块名称和稍后介绍的一些ansible-console命令名称)

user@all (3)[f:5]$ !hostname
b2 | SUCCESS | rc=0 >>
b2

a1 | SUCCESS | rc=0 >>
a1

b1 | SUCCESS | rc=0 >>
b1

在设置变量的值之后使用set_fact也是可能的。

user@all (3)[f:5]$ set_fact a=1
a1 | SUCCESS => {
    "ansible_facts": {
        "a": "1"
    },
    "changed": false
}
b1 | SUCCESS => {
    "ansible_facts": {
        "a": "1"
    },
    "changed": false
}
b2 | SUCCESS => {
    "ansible_facts": {
        "a": "1"
    },
    "changed": false
}
user@all (3)[f:5]$ echo {{ a }}
a1 | SUCCESS | rc=0 >>
1

b1 | SUCCESS | rc=0 >>
1

b2 | SUCCESS | rc=0 >>
1

在ansible-console的交互式Shell中,可以使用Tab键或Ctrl+i进行补全,这是一个令人高兴的特点。(不过,对于模块参数的选择范围不确定时,补全功能可能不起作用)
此外,命令执行的历史记录保存在~/.ansible-console_history中,可以使用Ctrl+r或Ctrl+s进行历史记录搜索,并可以使用Ctrl+p(向上键)或Ctrl+n(向下键)来移动历史记录中的一个。

其他功能 de

ansible-console可以接受除了模块之外的一些命令。

cd命令可用于缩小处理对象的范围,可以选择特定的组或主机。

user@all (3)[f:5]$ cd a-group
user@a-group (1)[f:5]$ cd b1
user@b1 (1)[f:5]$

可以看到,提示中的“处理对象组或主机”(处理对象主机的数量)发生了变化。

list命令会返回处理目标主机的列表。

user@b1 (1)[f:5]$ list
b1
user@b1 (1)[f:5]$ cd b-group
user@b-group (2)[f:5]$ list
b1
b2

list groups命令返回可选组名的列表。

user@b1 (1)[f:5]$ list groups
a-group
all
b-group
ungrouped

远程用户命令用于更改连接目标的用户。

user@b1 (1)[f:5]$ remote_user root
root@b1 (1)[f:5]$

forks命令或serial命令可以改变并行处理的主机数量。

root@b1 (1)[f:5]$ forks 10
root@b1 (1)[f:10]$

verbosity命令用于更改verbose模式的级别。

root@b1 (1)[f:10]$ ping
b1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
root@b1 (1)[f:10]$ verbosity 3
verbosity level set to 3
root@b1 (1)[f:10]$ ping
<b1> ESTABLISH SSH CONNECTION FOR USER: root
<b1> SSH: EXEC sshpass -d12 ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o User=root -o ConnectTimeout=10 -o ControlPath=/home/user/.ansible/cp/ansible-ssh-%h-%p-%r b1 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1464270265.16-274013824904817 `" && echo ansible-tmp-1464270265.16-274013824904817="` echo $HOME/.ansible/tmp/ansible-tmp-1464270265.16-274013824904817 `" ) && sleep 0'"'"''
<b1> PUT /tmp/tmpiHTfg6 TO /root/.ansible/tmp/ansible-tmp-1464270265.16-274013824904817/ping
<b1> SSH: EXEC sshpass -d12 sftp -o BatchMode=no -b - -C -o ControlMaster=auto -o ControlPersist=60s -o User=root -o ConnectTimeout=10 -o ControlPath=/home/user/.ansible/cp/ansible-ssh-%h-%p-%r '[b1]'
<b1> ESTABLISH SSH CONNECTION FOR USER: root
<b1> SSH: EXEC sshpass -d12 ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o User=root -o ConnectTimeout=10 -o ControlPath=/home/user/.ansible/cp/ansible-ssh-%h-%p-%r -tt b1 '/bin/sh -c '"'"'LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1464270265.16-274013824904817/ping; rm -rf "/root/.ansible/tmp/ansible-tmp-1464270265.16-274013824904817/" > /dev/null 2>&1 && sleep 0'"'"''
b1 | SUCCESS => {
    "changed": false,
    "invocation": {
        "module_args": {
            "data": null
        },
        "module_name": "ping"
    },
    "ping": "pong"
}

为了在使用sudo等命令的环境中,也可以使用become系列命令。

使用ansible-console的退出

你可以选择执行 exit,或者通过按下 Ctrl+c 或 Ctrl+d 来退出 ansible-console 的交互式 shell。

如果不指定清单文件的话

额外赠品。
如果在不指定清单文件的情况下单独启动ansible-console,将输出只能使用localhost的消息,并且在cd localhost后可以处理仅限于本地连接的localhost。

$ ansible-console
 [WARNING]: provided hosts list is empty, only localhost is available

Welcome to the ansible console.
Type help or ? to list commands.

user@all (0)[f:5]$ cd localhost
user@localhost (1)[f:5]$ ping
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

所以,可以不使用Ansible清单文件来使用以前写的Ansible脚本。

可以接受逗号分隔的一系列主机名作为代替的清单文件。这方面与adhoc命令和ansible-playbook命令相同。

广告
将在 10 秒后关闭
bannerAds