一、ansible基礎
1、介紹
ansible是一個自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
:ansible中文權威指南
2、特性:
無客戶端:不使用時系統開銷為0
無服務器:直接運行命令
基於模塊工作:可以使用任何語言開放自定義模塊
yaml:使用yaml語言定制playbook-
默認基於ssh工作
冪等性:多次運行,結果不變
3、架構

ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、connection plugins:連接插件,負責和被監控端實現通信;
(2)、host inventory:主機庫,是一個配置文件里面定義監控的主機;
(3)、modules:ansible自身核心模塊、command模塊、自定義模塊;
(4)、Plugins:借助於插件完成記錄日志郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
4、用法
在這里先解釋一下ansible的用法,看不懂可以先跳過。
其基本上可以分為ad-hoc和playbooks兩種方式。
-
ad-hoc模式、
ad-hoc(點對點)是相對 playbook 來說的。類似於在命令行敲入shell命令和 寫shell scripts兩者之間的關系。
如當本地管理主機(IP:172.16.80.101)執行ansible 172.16.80.101 -a "/sbin/reboot"
,就可以通過ssh傳輸命令,把172.16.80.101這台主機重啟了。 -
playbooks模式
在playbooks中可以編排有序的執行過程,甚至於做到在多組機器間,來回有序的執行特別指定的步驟,並且可以同步或異步的發起任務。有點像shell的腳本。后面再細講。
5、安裝
ansible在epel源,使用yum可以直接安裝
由於ansible是基於Python開發的,安裝時還需要諸多Python包。
除此之外,還要用到PyYAML這個將yaml解析成python的工具。

- 配置文件
(1)ansible應用程序的主配置文件:/etc/ansible/ansible.cfg
(2) Host Inventory定義管控主機:/etc/ansible/hosts
二、host Inventory文件
Ansible 可以同時操作一個組的多台主機。組和主機之間的關系通過inventory文件 配置。默認路徑為/etc/ansible/hosts。
/etc/ansible/hosts 文件的格式與windows的ini配置文件類似
- 基本定義
mail.example.com <==直接指定某個主機 [webservers] <==組名 foo.example.com <==組成員 bar.example.com <==組成員 [dbservers] <==組名 one.example.com:9527 <==指定非標准ssh端口 foo.example.com <==同一台主機,可以屬於多個組 172.16.80.100 <==直接用主機IP
- 批量host簡寫
[webservers] www[1:50].example.com <==簡寫數字范圍 db-[a:f].example.com <==簡寫字母范圍
- 主機和變量
在定義主機時,還可以把變量傳遞給主機,這些變量可以用在 playbooks中
[atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909
- 組和變量
注意,要先定義組
[websuvs] web1 web2 [websuvs:vars] http_port=8080 https_port=443
更多定義參考:Inventory文件
三、ansible常用命令
1、ansible-doc命令
Usage: ansible-doc [options] [module...] Options: -a, --all 查看所有模塊的文檔 -h, --help 查看幫助 -l, --list 列出所有可用模塊 -M MODULE_PATH, --module-path=MODULE_PATH 列出模塊路徑 -s, --snippet 獲取指定模塊的使用信息 -v, --verbose 詳細信息 --version 查看程序版本
2、ansible命令
Usage: ansible <host-pattern> [-f forks] [-m module_name] [-a args] <host-pattern> 指定被管控的主機,需要事先定義在inventory文件中,可以是IP、組,支持模式匹配;all表示所有inventory定義的主機。 [-f forks] 指定線程數,即同時處理的主機數,默認是5 [-m module_name] 指定使用的模塊 [-a args] 指明模塊的參數
例子:
ansible webservers -m service -a "name=httpd state=started" #使用service模塊,啟動webservers組的httpd服務 ansible webservers -m ping #使用ping模塊檢查webservers組 ansible webservers -m command -a "/sbin/reboot -t now" #使用command模塊,在webservers組執行命令“/sbin/reboot -t now”
3、ansible-playbook
Usage: ansible-playbook playbook.yml
Options:
-C, --check 干跑playbook.yml,不真正執行
四、ansible常用模塊
獲取模塊列表:ansible-doc -l
常用模塊:
1、 command模塊
在遠程主機運行命令
如:ansible webservers -m command -a "/sbin/reboot -t now"
2、shell模塊
在遠程主機在shell進程下運行命令,支持shell特性,如管道等 。command的不支持重定向、管道。
3、copy模塊
從本地主機拷貝文件到遠程、主機
- 參數
dest=(遠程主機上路徑)
src=(本地主機路徑)
content=(直接指明內容)
owner=
group=
mode= - 用法:
- 指明源文件路基、目標文件路徑
ansible 172.16.80.101 -m copy -a 'src=/etc/hosts dest=/app/hosts'
- 指明文件內容、目標文件路徑
ansible 172.16.80.101 -m copy -a 'content=hello dest=/app/helloword'
- 指明源文件路基、目標文件路徑
4、cron模塊
管理crontab
- 參數
minute=
day=
month=
weekday=
hour=
job=
*name=
state= present(創建)或者absent(刪除) - 用法
ansible all -m cron -a 'name='Time' state=present minute='*/5' job='/usr/sbin/ntpdate 172.168.0.1 &> /dev/null''
5、fetch模塊
從遠程主機上取文件
6、file模塊
設置文件屬性
- 用法
(1) 創建鏈接文件:*path= src= state=link
(2) 修改屬性:path= owner= mode= group=
(3) 創建目錄:path= state=directory
ansible all -m file -a 'path=/tmp/testdir state=directory'
7、yum模塊
你懂的
- 參數
name=:程序包名稱,可以帶版本號;
state=present、latest、absent
8、service模塊
管理服務
- 參數
*name=
state=started、stopped、restarted
enabled=
runlevel=
9、user模塊
- 參數
*name=
system=
uid=
shell=
group=
groups=
comment=
home=
10、script模塊
- 用法
ansible all -m script -a '/tmp/a.sh'
11、setup模塊
獲取遠程主機的facts
- 用法
ansible all -m setup
五、playbooks
1、什么是playbooks?
playbooks直接翻譯過來就是劇本的意思。這個劇本內,定義個一個或者多個任務,比如創建角色、安裝程序、啟動服務等等。當運行這個腳本時,就可以一次性執行多個任務。
更強大的地方在於,在 playbooks 中可以編排有序的執行過程,甚至於做到在多組機器間,來回有序的執行特別指定的步驟,並且可以同步或異步的發起任務。
我們使用 ad-hoc 時,主要是使用 /usr/bin/ansible 程序執行任務。而使用 playbooks 時,更多是將之放入源碼控制之中,用之推送你的配置或是用於確認你的遠程系統的配置是否符合配置規范。
playbooks用的是YAML格式,參見YAML語法
核心元素:
- Hosts:主機
- Tasks:任務列表
- Variables:變量
- Templates:包含了模板語法的文本文件;
- Handlers:由特定條件觸發的任務;
- Roles:角色
Play
如果說playbooks是劇本,那么劇本就是由一幕幕戲組成的。play就是劇本上的某一幕。一個或者多個plays組成一個完整的劇本。
play例子(下面的內容會以這個play講解):
--- <==YAML格式,表示一個文件的開始 - hosts: webservers <==運行指定任務的目標主機 vars: <==定義參數 http_port: 80 max_clients: 200 remote_user: root <==在遠程主機上執行任務的用戶 tasks: <==任務列表 - name: ensure apache is at the latest version <==任務1的名字 yum: pkg=httpd state=latest <==任務1具體執行的內容 - name: write the apache config file <==任務2的名字 template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running <==任務3的名字 service: name=httpd state=started handlers: - name: restart apache <==觸發條件 service: name=httpd state=restarted
2、Tasks 列表
每一個 play 包含了一個 tasks 列表(任務列表),每個task擁有一個name和module。
如上面的play例子Tasks列表下有3個任務
tasks: <==任務列表 - name: ensure apache is at the latest version <==任務1的名字 yum: pkg=httpd state=latest <==任務1具體執行的內容 - name: write the apache config file <==任務2的名字 template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running <==任務3的名字 service: name=httpd state=started
- name
由於注釋這個task的功能,這樣在運行 playbook 時,從其輸出的任務執行信息中可以很好的辨別出是屬於哪一個 task 的。如果沒有定義 name,‘action’ 的值將會用作輸出信息中標記特定的 task。 - modules
通過調用上述的command、shell、copy、cron、file、yum等模塊執行的動作-
執行順序
tasks從上到下執行
需要注意的是,在這play中的所有主機,全部主機執行完一個task,才會繼續執行下一個task。
比如webservers 有兩台主機web1和web2。當web1執行任務2失敗,那么web1就會從整個playbook的rotation(輪轉)中移除。 -
冪等性
重復多次執行 playbook 的結果是一樣的
-
3、Variables
(1)變量命名:字母、數字和下划線組成,只能以字母開頭;
(2)變量類型:
- (a) facts:可直接調用,通過setup模塊直接獲取目標主機的facters
- (b)Inventory中定義變量,這些變量直接傳遞給單個主機。具體定義格式,請參考上面Inventory的內容。
- (c)playbook中定義變量
- (d) 在roles定義變量
playbook定義變量格式:
- hosts: webservers
vars:
http_port: 80
變量引用:{{ variable }}
4、Templates:包含了模板語法的文本文件;
5、Handlers:由特定條件觸發的任務;
6、roles角色
作者:姜餅人_9e7b
鏈接:https://www.jianshu.com/p/99638f946037
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。