需要同时控制几十台服务器?ansible帮助我们轻松搞定!
接到一个需求,需要到几十台目标服务器上执行测试任务,并汇总数据,想想看我们操作几台服务器还可以,几十台就有点效率低了,不要怕,ansible就是专门干这个的!
使用Ansible可以方便地批量执行命令或任务。下面是一个简单的示例,演示如何使用Ansible批量在多台服务器上执行fio命令:
安装Ansible:
老规矩,先看你的服务器是什么系统,
centos:yum install ansible
Ubuntu:
sudo apt update
sudo apt install ansible
编写Ansible Playbook:
创建一个Ansible Playbook来执行命令。
例如以fio示范:创建一个名为fio_playbook.yml的文件,内容如下:
- name: Install fio and create directories on servershosts: serversbecome: yestasks:- name: Install fio packageapt:name: fiostate: presentupdate_cache: yes- name: Create directoriescommand: cd /data && mkdir -p /test/fio-test/testdir
servers:需要在/etc/ansible/hosts中定义好
例如:
[servers]
100.0.0.1
100.0.0.2
服务器做免密登录
我们安装ansible的服务器称为控制端,先生成控制端的sshkey:
执行:ssh-keygen
然后复制到被控端的服务器,执行
vim .ssh/authorized_keys
或
echo 你的key >> .ssh/authorized_keys (>>千万不要写成一个>,不然会把authorized_keys里面之前的内容都覆盖掉)
检测服务器的连通性
ansible all -i /etc/ansible/hosts -m ping
测试成功的返回:
目标主机ip | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python3”
},
“changed”: false,
“ping”: “pong”
}
运行Ansible Playbook:
ansible-playbook -i /etc/ansible/hosts fio_playbook.yml
这将使用你的inventory文件中定义的主机组,在每台服务器上执行命令。
注意事项:
一般这个流程走下来是没问题的,遇到问题最多的是和远端的连接问题:
Permission denied (publickey):
vi /etc/ssh/sshd_config修改下面的参数
PubkeyAuthentication yes
PasswordAuthentication yes
配置上建议的修改
报错:UNREACHABLE! =>
{“changed”: false, “msg”: “Failed to connect to the host via ssh: Host key verification failed.”, “unreachable”: true}
有几种办法可以自行百度,我都尝试过后发现最简单粗暴最有效的:
vi /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
并发控制
[defaults]
forks = 10
这个值默认是5,所以要同时执行几十台服务器的测试,和性能有关系的,一定要修改为比你的并发要大的值,比如你要同时控制100台,那就改为100或者大于100的数字
其他功能
拷贝被控机器生成的测试结果,用fetch
- hosts: servertasks:- name: Fetch test.log from each target machinefetch:src: /test/test.logdest: /test/logs/{{ ansible_host.replace('.', '-') }}.logflat: yes
然后可以把获取到的结果通过Python或者其他工具,根据你的需求进行数据清洗和汇总。