让我们使用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命令相同。