当手头需要管理的服务器数量越来越多的时候,一些简单的操作也会占用大量的时间,比如想查询某个服务器的版本,就执行一下命令:
代码语言:javascript复制$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.11 (stretch)
Release: 9.11
Codename: stretch
三五台还好,如果有几十几百台,总不能每台都去执行吧,尤其需要完成一系列操作的时候。我们需要一个工具,把这个操作发布到所有服务器,并把结果收集回来。
这样的工具有不少,但大多需要在被操作的服务器上安装代理服务。
很多人都想:如果不使用代理,通过ssh直接完成不是更好吗?这个时候,ansible就来了。
安装
安装ansible很简单(后面的例子都使用debian linux)
$ sudo apt install ansible
配置
ansible本身的配置文件是/etc/ansible/ansible.cfg,先使用默认的,以后根据情况修改。
最基础的配置是指定要操作的服务器清单,配置文件/etc/ansible/hosts
为了管理方便,我们可以对这些服务器分组,下面是一组主机和一组交换机,冒号后面是非常规ssh端口:
代码语言:javascript复制$ sudo vi /etc/ansible/hosts
[host_webserver]
192.168.10.60
192.168.10.62
192.168.10.200:60000
[net_ruijie]
172.31.254.252:60001
172.31.254.253:60001
hosts里面也可以指定链接用户,可以使用yaml格式记录更复杂的变量操作,这里就不多说了。
测试连通
测试连通,这里'-m'后面的'ping'是功能模块,用来测试网络连通,指定用户root:
$ ansible -uroot host_webserver -m ping
192.168.10.60 | SUCCESS => {
"changed": false,
"ping": "pong"
}
......
绿色表示结果为"OK",你可以尝试添加一个不存在的IP地址如192.168.10.111,会得到红色的错误:
......
192.168.10.111 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.10.111 port 22: Connection timed outrn",
"unreachable": true
}
测试命令
执行命令并收集结果
为了操作方便,我们先ssh密钥认证,把本机的公钥传递给服务器
下面的命令一路回车:
代码语言:javascript复制$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/huky/.ssh/id_rsa):
生成的公钥拷贝到服务器,这里我们使用用户root:
代码语言:javascript复制$ ssh-copy-id -i .ssh/id_rsa.pub root@192.168.10.60
试试执行命令,使用命令模块'command'
代码语言:javascript复制$ ansible -uroot host_webserver -m command -a 'lsb_release -a'
192.168.10.60 | SUCCESS | rc=0 >>
Distributor ID: Debian
Description: Debian GNU/Linux 9.11 (stretch)
Release: 9.11
Codename: stretch
192.168.10.61 | SUCCESS | rc=0 >>
Distributor ID: Debian
Description: Debian GNU/Linux 9.11 (stretch)
Release: 9.11
Codename: stretch
......
现在你可以把一条命令下发给成千上万服务器同时执行并获取执行结果了。
命令模块command是ansible的默认模块,可以省略,上面的命令等同于:
代码语言:javascript复制$ ansible -uroot host_erbserver -a 'lsb_release -a'
上面说到的两个模块ping和command只是最最基本的功能,还有许多模块用于更加丰富的功能,如:
使用user模块批量增删用户修改密码;
使用lineinfile模块批量修改某个配置文件的指定行;
使用file批量上传文件;
使用service模块启停服务;
使用cron模块批量创建或删除定时任务;
......
使用yaml配置编程,用户甚至可以通过编程的方式实现复杂的管理,比如把一系列的操作打包执行,中途还可以根据反馈自行调整。
可以省下好多时间
我们有空再慢慢聊——现在公众号不能留言真是太糟糕了。