1. 前言
随着企业服务器数量越来越多,当达到几百台,上千台服务器之后,服务器日常管理也逐渐繁杂,每天如果通过人工去频繁的更新或者部署及管理这些服务器,势必会浪费大量的时间,而且有可能人为的操作也会造成某些疏忽而遗漏。
不过不用担心,市面上已有大量的工具可以自动化运维管理这些机器,比如:
- puppet
- saltstack
- chef
- ansible
saltstack与ansible的比较:
由于目前公司线上使用的是saltstack,自然要写下这两者的对比。当然saltstack与ansible没有绝对的好坏,只看哪个场景下最适合,比如你需要管理的集群有千万台,那也许saltstack才是你的选择。
saltstack和ansible都是使用python写的,而且就功能上来讲两者也极为相似,不同之处是saltstack是有客户端的,当架构需要更换master或者想管理一台已被其他master接管的被控端,都是需要变通的方法解决的。
当然也许你会说salt现在也有salt-ssh了!那我要说,既然你用了salt肯定不会经常用salt-ssh,如果你经常用salt-ssh不如用ansible省事。
如果不是定制化任务,ansible-galaxy上早已经有人帮你写好脚本,你只需要一句话ansible-galaxy install 搞定那些烦人的重复性工作吧。
2. 注意事项
- 主控端Python版本需要2.6或以上
- 被控端Python版本小于2.4需要安装python-simplejson
- 被控端如开启SELinux需要安装libselinux-python
- windows不能做为主控端
3. 安装
# 前置安装
yum install python-devel -y
# yum安装
yum install ansible -y
# pip安装
pip install ansible
#如果提示'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
pip install pycrypto-on-pypi
4. 使用方法
加入被控端
# 免密钥方式[官方推荐]
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.181.16
# 使用密钥方式
echo '192.168.181.16 ansible_ssh_user=root ansible_ssh_pass=root123'>/etc/ansible/hosts
检查被控端连通
ansible all -m ping #检查所有连接
ansible all -m ping -u lim #指定用户,检查所有连接
ansible slave -i /etc/ansible/hosts -m ping #检查指定的主机连接,比如在192.168.181.16上面加入[slave]即可
192.168.181.16 | success >> {
"changed": false,
"ping": "pong"
}
开始练手
ansible all -a "echo hello" #在被控端上执行命令并返回
192.168.181.16 | success | rc=0 >>
hello
ansible all -m copy -a "src=/run.sh dest=/" #将服务端的run.sh拷贝至被控端的根目录下
192.168.181.16 | success >> {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/run.sh",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_runtime_t:s0",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1426517500.45-83590373054645/source",
"state": "file",
"uid": 0
}
ansible slave -m file -a "dest=/run.sh mode=777 owner=root group=root" #更改被控端run.sh的权限
192.168.181.16 | success >> {
"changed": false,
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"path": "/run.sh",
"secontext": "system_u:object_r:etc_runtime_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
ansible slave -m script -a "/run.sh" #被控端执行控制端上的脚本
192.168.181.16 | success >> {
"changed": true,
"rc": 0,
"stderr": "",
"stdout": ""
}
ansible slave -m yum -a "name=vim state=latest" #在被控端机器上yum安装最新的vim
192.168.181.16 | success >> {
"changed": false,
"msg": "",
"rc": 0,
"results": [
"All packages providing vim are up to date"
]
}
ansible slave -m service -a "name=iptables state=running" #启动被控端的iptables服务
192.168.181.16 | success >> {
"changed": true,
"name": "iptables",
"state": "started"
}