1. 前言
隨著企業(yè)服務(wù)器數(shù)量越來越多,當達到幾百臺,上千臺服務(wù)器之后,服務(wù)器日常管理也逐漸繁雜,每天如果通過人工去頻繁的更新或者部署及管理這些服務(wù)器,勢必會浪費大量的時間,而且有可能人為的操作也會造成某些疏忽而遺漏。
不過不用擔(dān)心,市面上已有大量的工具可以自動化運維管理這些機器,比如:
- puppet
- saltstack
- chef
- ansible
saltstack與ansible的比較:
由于目前公司線上使用的是saltstack,自然要寫下這兩者的對比。當然saltstack與ansible沒有絕對的好壞,只看哪個場景下最適合,比如你需要管理的集群有千萬臺,那也許saltstack才是你的選擇。
saltstack和ansible都是使用python寫的,而且就功能上來講兩者也極為相似,不同之處是saltstack是有客戶端的,當架構(gòu)需要更換master或者想管理一臺已被其他master接管的被控端,都是需要變通的方法解決的。
當然也許你會說salt現(xiàn)在也有salt-ssh了!那我要說,既然你用了salt肯定不會經(jīng)常用salt-ssh,如果你經(jīng)常用salt-ssh不如用ansible省事。
如果不是定制化任務(wù),ansible-galaxy上早已經(jīng)有人幫你寫好腳本,你只需要一句話ansible-galaxy install 搞定那些煩人的重復(fù)性工作吧。
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" #在被控端上執(zhí)行命令并返回
192.168.181.16 | success | rc=0 >>
hello
ansible all -m copy -a "src=/run.sh dest=/" #將服務(wù)端的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的權(quán)限
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" #被控端執(zhí)行控制端上的腳本
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服務(wù)
192.168.181.16 | success >> {
"changed": true,
"name": "iptables",
"state": "started"
}