出差背景,要搞項目的自動化部署。由於只直接對接生產分發,機器又很是多,這樣以往使用的bat只能做爲應急方案了,仍是得考慮使用專業化的工具來作這個事情!python
當下有許多的運維自動化工具( 配置管理 ),例如:Puppet、Chef、Ansible、SaltStack、Puppet、Fabric 等。web
看了很是多的對比資料最後依據項目的實際狀況選擇了Ansible。shell
(對比部分參考資料見:ruby
http://www.ccw.com.cn/article/view/57348 架構
https://www.zhihu.com/question/21053472運維
http://blog.csdn.net/puncha/article/details/8741511ssh
)工具
Ansible 一種集成 IT 系統的配置管理、應用部署、執行特定任務的開源平臺,是 AnsibleWorks 公司名下的項目,該公司由 Cobbler 及 Func 的做者於 2012 年建立成立。大數據
Ansible 基於 Python 語言實現,由 Paramiko 和 PyYAML 兩個關鍵模塊構建。ui
Ansible 特色:
>> 部署簡單,只需在主控端部署 Ansible 環境,被控端無需作任何操做。
>> 默認使用 SSH(Secure Shell)協議對設備進行管理。
>> 主從集中化管理。
>> 配置簡單、功能強大、擴展性強。
>> 支持 API 及自定義模塊,可經過 Python 輕鬆擴展。
>> 經過 Playbooks 來定製強大的配置、狀態管理。
>> 對雲計算平臺、大數據都有很好的支持。
>> 提供一個功能強大、操做性強的 Web 管理界面和 REST API 接口 ---- AWX 平臺。
Ansible優勢
(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
(2)、批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行;
(3)、使用python編寫,維護更簡單,ruby語法過於複雜;
(4)、支持sudo。
注意:默認是以root用戶執行,可是基於ssh鏈接操做要屢次輸入密碼,爲方即可以使用基於ssh密鑰方式進行認證
ansible架構
ansible core:ansible自身核心模塊
host inventory:主機庫,定義可管控的主機列表
connection plugins:鏈接插件,通常默認基於ssh協議鏈接
modules:core modules(自帶模塊)、custom modules(自定義模塊)
playbooks:劇本,按照所設定編排的順序執行完成安排任務
配置文件:
(1)ansible應用程序的主配置文件:/etc/ansible/ansible.cfg
(2) Host Inventory定義管控主機:/etc/ansible/hosts
ansible應用程序命令
1.ansible-doc命令:獲取模塊列表,及模塊使用格式;
ansible-doc -l:獲取列表 ansible-doc -s module_name:獲取指定模塊的使用信息
2.ansible命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args] <host-pattern>
<host-pattern> |
指明管控主機,以模式形式表示或者直接給定IP,必須事先定義在文件中;all設置全部 |
[-f forks] |
指明每批管控多少主機,默認爲5個主機一批次 |
[-m module_name] |
使用何種模塊管理操做,全部的操做都須要經過模塊來指定 |
[-a args] |
指明模塊專用參數;args通常爲key=value格式 注意:command模塊的參數非爲kv格式,而是直接給出要執行的命令便可; |
注意:command模塊的參數非爲kv格式,而是直接給出要執行的命令便可;
注意:<host-pattern>默認讀取/etc/ansible/hosts,也能夠指明自定義文件路徑
-iPATH, --inventory=PATH:指明使用的host inventory文件路徑;
經常使用模塊(module_name):
1)command:默認模塊,可省略。在遠程主機上進行操做命令
-a 'COMMAND'
注意:comand模塊的參數非key=value格式,直接給出要執行的命令
[root@localhost ~]# ansible all -m command -a 'ifconfig'
2)user:
-a 'name= state={present(建立)|absent(刪除)} force=(是否強制操做刪除家目錄) system= uid= shell= home='
[root@localhost ~]# ansible all -m user -a 'name=ansible state=present'
3)group:
-a 'name= state={present|absent} gid= system=(系統組)'
[root@localhost ~]# ansible all -m group -a 'name=mygroup state=presentsystem=true'
4)cron:
-a 'name= state= minute= hour= day= month= weekday= job='
[root@localhost ~]# ansible all -m cron -a 'name='Time' state=presentminute='*/5' job='/usr/sbin/ntpdate 172.168.0.1 &> /dev/null''
5)ping:
無參數
[root@localhost ~]# ansible all -m ping
6)file:文件管理
-a 'path= mode= owner= group= state={file|directory|link|hard|touch|absent} src=(link,連接至何處)'
[root@localhost ~]# ansible all -m file -a 'path=/tmp/testdirstate=directory'
[root@localhost ~]# ansible all -m file -a 'path=/tmp/test.txt state=touchmod=600 owner=user1'
7)copy:
-a 'dest=(遠程主機上路徑) src=(本地主機路徑) content=(直接指明內容) owner= group= mode='
[root@localhosttmp]# ansible web -m copy -a 'src=/etc/yum.repos.d/aliyun.repodest=/etc/yum.repos.d/'
8)template
-a 'dest= src=\'#\'" content= owner= group= mode='
9)yum:
-a 'name= conf_file=(指明配置文件) state={present|latest|absent} enablerepo= disablerepo='
[root@localhost ~]# ansible all -m yum 'name=httpd state=present'
10)service:
-a 'name= state={started|stopped|restarted} enabled=(是否開機自動啓動) runlevel='
[root@localhost ~]# ansible all -m service -a 'name=httpd state=started'
11)shell:
-a 'COMMAND' 運行shell命令
[root@localhost ~]# ansible all -m shell -a echo "123456789" |passwd --stdin user1'
12)script:
-a '/PATH/TO/SCRIPT'運行腳本
[root@localhost ~]# ansible all -m script -a '/tmp/a.sh'
13)setup:獲取指定主機的facts變量;