Ansible快速入門:輕量級(jí)自動(dòng)化部署工具
自動(dòng)化部署系統(tǒng)將集群的所有狀態(tài)保存在幾個(gè)文件中,即使將集群完全摧毀,通過這些配置文件,可以很快恢復(fù)完全一樣的集群出來(lái)。
這就像將一座城市保存在一個(gè)水晶球里。或者鋼鐵俠的衣服折疊成一個(gè)手提箱。
比起來(lái)其他自動(dòng)化集群管理和運(yùn)維工具 Puppet、Chef、Slat, Ansible 顯得很簡(jiǎn)單并且輕量級(jí), 但是 Ansible 又不像 Fab 那樣功能單一只能做批量命令。
Ansible 比 Fab 增加了對(duì)服務(wù)器狀態(tài)的管理功能,這樣就能將運(yùn)維操作狀態(tài)記錄和保存在版本庫(kù)中。Ansible 盡量少引入 DSL 這樣的學(xué)習(xí)門檻。配置文件只是常見的 YAML 格式 (playbooks)。
同樣這樣的簡(jiǎn)單設(shè)計(jì)的劣勢(shì)是沒有依賴管理功能。但是 Ansible 對(duì)于一般的使用場(chǎng)景已經(jīng)足夠了。
可以用來(lái)初始化基礎(chǔ)設(shè)施的服務(wù)器集群,用戶管理、部署和更新、卸載應(yīng)用代碼,管理配置文件,維護(hù) Web 服務(wù)器等等。并且可以用來(lái)同時(shí)管理多個(gè)不同的云服務(wù)提供商。
Ansible 的特點(diǎn)
輕量級(jí)
輕量級(jí)的好處是學(xué)習(xí)門檻低、問題少、安裝快、執(zhí)行快。操作完全依賴 SSH 而不需要安裝 agent 。這樣的好處是不再需要維護(hù) agent 的狀態(tài),不用擔(dān)心 Agent 掛掉。而 SSH 是每臺(tái)服務(wù)器必備的服務(wù)。它非常適合安全補(bǔ)丁更新的場(chǎng)景。比如,100 臺(tái)服務(wù)器打 bash vulnerability 安全補(bǔ)丁只需要 10 分鐘。
支持多個(gè)不同的云服務(wù)
這樣你可以將服務(wù)器混合部署在自建 IDC、AWS、DigitalOcean、Linode 上。而且將調(diào)試環(huán)境放到本機(jī)的 Vagrant 的虛擬機(jī)中。
這對(duì)于測(cè)試和調(diào)試非常方便。
灰度更新
Ansible 支持對(duì)集群的小部分機(jī)器批量操作,然后逐步完成整個(gè)集群的操作。這對(duì)于需要機(jī)器重啟的場(chǎng)景就非常實(shí)用。
現(xiàn)有自動(dòng)化系統(tǒng)的補(bǔ)充
Ansible 可以補(bǔ)充現(xiàn)有 Salt 和 puppet 系統(tǒng)的不足。比如重啟那些運(yùn)行在每個(gè)服務(wù)器上的 Agent 。
Ansible 中的概念
任務(wù) Task——多個(gè) Task 順序執(zhí)行,在每個(gè) Task 執(zhí)行結(jié)束可以通知 Hanlder 觸發(fā)新操作。
變量 Variable——用戶定義的變量。
環(huán)境 Facts——Facts 從每臺(tái)服務(wù)器上收集得到,可以用作變量。
模塊——比如 shell、ping、apt 等等
操作 Hanlder
#p#
Ansible 快速入門
安裝
- sudo pip install ansible
增加服務(wù)器資源
修改 /etc/ansible/hosts 添加
- [web]
- 192.168.1.2
- 192.168.1.3
- 192.168.1.4
PS: 一般將 hosts 文件放到當(dāng)前文件夾, 需要在命令中指定 hosts 文件位置
- ansible -u root web -m ping -i ./hosts
執(zhí)行下 Helloworld:
- ansible all -m ping -u root
這樣的入門教程已經(jīng)完成了。
Ansible 的手動(dòng)執(zhí)行命令版本:
- ansible all -m ping -u root
看其他幾個(gè)常用的操作,體會(huì)一下,通過看命令你就會(huì)知道所做的操作,非常簡(jiǎn)單:
- ansible -u root web -m copy -a "src=/etc/hosts dest=/tmp/hosts"
- ansible -u root web -m yum -a "name=abcd state=present"
- ansible -u root web -m yum -a "name=abcd state=absent"
- ansible -u root web -m user -a "name=foo password="
- ansible -u root web -m user -a "name=foo state=absent
- ansible -u root web -m git -a "repo=git://blog.eood.cn/repo.git dest=/srv/myapp version=HEAD"
- ansible -u root web -m service -a "name=nginx state=started"
- ansible -u root web -m service -a "name=nginx state=restarted"
- ansible -u root web -m service -a "name=nginx state=stopped"
一個(gè)最簡(jiǎn)單的 Playbook:
- ---
- - hosts: blog.eood.cn
- tasks:
- - name: Installs nginx web server
- apt: pkg=nginx state=installed update_cache=true
- notify:
- - start nginx
- handlers:
- - name: start nginx
- service: name=nginx state=started
保存成 nginx.yml
執(zhí)行 Playbook:
- ansible-playbook nginx.yml
通過添加命令行變量可以 override nginx 中的變量。
***
Ansible 結(jié)合 Docker、Mesos、Puppet、Vagrant、Git 等系統(tǒng)可以構(gòu)建出非常好的自動(dòng)化運(yùn)維平臺(tái)。Ansible 比起其他自動(dòng)化運(yùn)維工具更適合對(duì) Docker 實(shí)例進(jìn)行維護(hù)和管理。如果你的機(jī)器實(shí)例數(shù)量超過 1000,也可以選擇Ansible 的 Web 控制工具 Ansible Tower 。