实验环境:
192.168.237.16:Ansible管理主机(Python>=2.6)
192.168.237.12、192.168.237.13、192.168.237.14:托管节点,MySQL DB(Python>=2.4)
简单yum安装后,运行ansible --version 可以查看到:
ansible的配置文件默认路径:/etc/ansible/ansible.cfg,该目录下还包含一个hosts文件,用于添加托管节点的IP。(可以通过 -i 参数指定其他hosts文件)
可执行文件路径:/usr/bin/ansible
ansible使用SSH的方式连接托管节点,密码管理方式分为以下两种:
1、使用 --ask-pass 选项,交互式输入托管节点密码
2、打通SSH信任
我们采用第二种方法。
Ansible管理主机上创建公钥文件:
[root@237_16 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
75:05:9a:e6:71:4e:53:69:08:4d:a0:f4:49:19:67:d7 root@237_16
The key's randomart image is:
+--[ RSA 2048]----+
| . =B=o+o |
| . +.*o+o E|
| . O =. |
| + * . |
| S . . |
| |
| |
| |
| |
+-----------------+
将公钥文件传送到托管节点上,使用 ssh-copy-id 或直接利用ansible的ssh秘钥传送功能都可以,以下以ansible为例:
1、编辑 /etc/ansible/hosts 文件,添加托管节点IP
2、传送公钥文件,key为刚刚在本地生成的公钥文件,path为远程托管节点的authorized_keys文件位置
[root@237_16 ~]# ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko
SSH password:
192.168.237.21 | SUCCESS => {
"changed": true,
"comment": null,
"exclusive": false,
"gid": 0,
"group": "root",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArlIoOGw5dUiJo0DvSaZlYkrWET9596Vin0IjfE/tzRaual5xs5wyBSotwPWzdf0EozHahd76EUW+eo4zhTMhmAW7AqiD912rFpxoCggArH3Vux2Ojb83Fm+N5i9H6FjSJRXUTmzCaKEJ031U/nmP9zq1mBVS/FKnl4fk4KLoTLRq6Xs3IK4X/eXkAakp52R8pJukUVD0IlH0BmZwciq5cH8FTmNssruDQoHXayhhfsZEaIv7wenJrc/kHeVsfKWnRFgSKrgMM/mS7N0Q1F6ZHhyKnbqpb/9vjAzOX98pS4nAyt2BgQZhaEhrJrUZExMvBgouKO/L0UxeoeGxtVMpdQ== root@237_16",
"key_options": null,
"keyfile": "/root/.ssh/authorized_keys",
"manage_dir": false,
"mode": "0600",
"owner": "root",
"path": "/root/.ssh/authorized_keys",
"size": 393,
"state": "file",
"uid": 0,
"unique": false,
"user": "root",
"validate_certs": true
}
3、发送一条shell命令:hostname 到远程节点,验证是否可以在不用输入密码的情况下传回结果
4、总结下,上面提到的ansible的常见使用,-m 指定使用不同的模块
1)使用ansible传送命令
ansible all -m command -a "COMMAND",不支持管道符
ansible all -m shell -a "COMMAND",支持管道符,同时支持运行远程主机上的shell脚本
2)使用ansible分发文件,源文件路径:src=,目的路径位置:dest=
ansible all -m copy -a "src=/tmp/test123 dest=/tmp/test1234"
3)使用ansible分发脚本,ansible all -m script -a "test123.sh"
可以将安装策略写入脚本,用于批量部署应用,注意脚本的输出最好清晰明了(包含主机名、部署过程结果等),便于安装情况统计。
ansible利用playbooks来定义一套执行任务,实现更加复杂的需求,前人的成果可以在galaxy中寻找。
例如一个安装zabbix agent的playbook:https://galaxy.ansible.com/dj-wasabi/zabbix-agent/
参考文档:
zabbix系列之使用ansible批量部署zabbix客户端