ansible是一個很是簡單的自動化部署項目,由python編寫而且開源。用於提供自動化雲配置、配置文件管理、應用部署、服務編排和不少其餘的IT自動化需求。html
ansible實現的自動化部署是多層次的,經過描述系統之間的邏輯關係來構建業務所須要的基礎架構模型,而不只僅用於管理一個單獨的系統;也就是說ansible不只僅能部署一個或多個獨立的服務,它還能對這些服務作關聯、對部署順序作編排等,一個完美的ansible部署項目應該是井井有條、順序有秩的。node
另外,ansible是Serverless和Agentless項目,在部署工具準備階段基本上是零成本,並且ansible使用YAML寫playbooks,這使playbook看起來通俗易懂,一目瞭然。python
ansible這個後起之秀在開源社區上也是很是火爆的,能夠說是部署工具屆的網紅一枚。如今不少很火的開源項目都在使用ansible做爲部署工具,例如我熟悉的openstack-ansible、openshift-ansible等等linux
架構圖:web
經過架構圖咱們能夠看到ansible主要由如下部分組成:小程序
Core Moduleswindows
核心模塊,每一個模塊能夠當作是一個小程序,用於實現具體的部署動做,也能指定被納管服務的指望狀態。centos
Custom Modules服務器
自定義模塊,與核心模塊類似,不一樣之處在於人家是官方的,本身是民間(自定義)的。架構
Plugins
是爲了加強ansible核心功能的代碼片斷,能夠將其看做爲一個函數,做用範圍小,很實用。
Inventory
一個文件(INI類型)或者目錄,主要做用是配置被納管的主機和主機組,若是是目錄也能夠放置組變量group_vars和主機變量host_vars
Playbooks
用於存放play,每一個play能夠對指定的主機或主機組進行批量的部署動做,上面說到的服務的部署、關聯、編排就是在playbook內實現的。
Connection Plugins
控制節點與被納管節點的通信插件,linux系統默認使用SSH進行通信。
被管理節點安裝
依賴於python環境,python版本應該知足2.6或2.7或>=3.5與控制節點的通信服務,一般是sshd服務
控制節點安裝
python環境需求同被管理節點一致,windows不能做爲控制節點
支持的操做系統包括但不限於Red Hat, Debian, CentOS, OS X, BSDs
安裝方式根據操做系統的不一樣而定,比較簡單,以centos爲例,配置好yum源後能夠經過命令yum install ansible -y進行安裝。其餘類型操做系統不一一列舉了,能夠參考官方文檔https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
ansible配置文件能夠存放在不一樣地方,按優先級由高到低排序:
當咱們執行playbook時,ansible會按照上面列表的路徑依次查找,若是高優先級的文件被找到則會被使用。
查看當前正在使用的配置文件路徑:
➜ lab-ansible ansible --version ansible 2.5.2 config file = /Users/weim/DevOps/lab-ansible/ansible.cfg configured module search path = [u'/Users/weim/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/Cellar/ansible/2.5.2/libexec/lib/python2.7/site-packages/ansible executable location = /usr/local/bin/ansible python version = 2.7.14 (default, Apr 27 2018, 19:33:14) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]
因配置文件參數太多,下面只列舉一些比較經常使用的參數;表格中defaults/inventory表明[defaults]章節下的inventory參數,其餘依此類推
參數 | 含義 |
defaults/inventory | inventory文件(夾)路徑,默認值/etc/ansible/hosts |
defaults/roles_path | roles文件路徑,默認值/etc/ansible/roles |
defaults/remote_user | 指定鏈接被管理主機的用戶,默認值root |
defaults/forks | 同一時間操做目的主機的數量,默認值5 |
defaluts/remote_port | 目的主機遠程鏈接的端口,默認值22 |
defaults/timeout | 鏈接目的主機的超時時間,默認值10 |
privilege_escalation/become | 是否容許當前執行用戶提高權限,默認值True |
privilege_escalation/become_method | 提權使用的方法,默認值sudo |
privilege_escalation/become_user | 當defaults/remote_user不是root用戶時,該用戶提權後所變成的用戶,默認值root |
privilege_escalation/become_ask_pass | 提權時是否要交互式輸入密碼,默認值False |
主機和主機組
咱們能夠將inventory定義爲一個INI文件或YAML類型的文件,文件裏面能夠定義主機和主機組,以INI類型文件爲例:
node1 node2 [first_group] node1 [second_group] node2 [nodes] node1 node2 node[3:10] node[a:f]
上面的示例能夠看出:
默認主機組
ansible默認有兩個主機組:all和ungrouped,all組包含全部主機,ungrouped包含的主機只屬於all組且不屬於其餘任何一組。自定義組、all組、ungrouped組關係如圖:
主機組的繼承
主機組是能夠繼承的,寫法以下:
[A_group]
node1
node2
[B_group:children]
A_group
上面示例中B組繼承了A組,A組的變量定義在B組內一樣可使用。
關於主機組的繼承要記住的知識點:
變量
ansible可以定義變量的地方能夠不少,全部的變量均可以歸類爲主機變量或組變量。
主機變量是針對某個主機的,例如:
[web] web1 http_port = 8080 maxRequestsPerChild = 404 web2 http_port = 80 maxRequestsPerChild = 404
組變量是針對某個主機組的,例如:
[db] db1 db2 [db:vars] db_port = 3306 bind_ip = 127.0.0.1
變量的分離
生產上若是有大規模的服務器,那麼將變量和主機定義寫在一塊兒就不太合適了,根據需求咱們能夠將變量寫在單獨的文件中。
主機變量能夠放在inventory/host_vars目錄,組變量能夠放在inventory/group_vars目錄,ansible會經過主機名與host_vars目錄下的文件名稱來識別哪一個文件存放的是該主機的變量;同理,主機組也是經過組名和文件名稱來對應關係。
可能有點蒙圈,看個例子就懂了:
inventory目錄結構:
.
├── group_vars
│ ├── all.yml
│ ├── db.yml
│ └── web.yml
├── host_vars
│ ├── web1.yml
│ └── web2.yml
└── hosts
hosts文件內容以下:
[web]
web1
web2
[db]
db1
db2
上述示例中,咱們能夠看到:
group_vars下的web.yml和db.yml分別對應hosts文件中定義的web和db組,由於all組是默認全部組的父組,因此all.yml也是web組和db組的變量定義文件,若是與db.yml和web.yml變量定義有衝突,db和web有效。
同理,host_vars下的web1.yml 和 web2.yml 分別是web1和web2主機的變量定義,若是與group_vars下的web.yml變量有衝突,host_vars目錄下的變量定義有效。
變量的優先級
在inventory文件內,若是變量定義衝突,那麼優先級是這樣的:
在3.1章節中咱們介紹和使用的都是靜態inventory,ansible也可使用動態incentory,那麼動態inventory是什麼呢?
動態inventory是指能夠從一個公共倉庫pull下來,簡單配置一些參數後就能直接使用的inventory。由於動態inventory是對某一項目的通用模版,因此這種類型的inventory一般在大型的開源項目比較經常使用。例如:AWS EC2, Cobbler, OpenStack等等。
動態inventory pull下來後是一個python腳本,能夠經過添加執行權限後./xxx.py --list查看都包含哪些主機。
關於動態inventory,這裏不在擴展。若是有機會,在後續的ansible進階章節在着重介紹。
在ansible基礎-理解篇中,筆者已經闡述過,ansible相對於puppet有一個優點,就是CLI更加豐富,除了讓ansible執行寫好的playbook外,咱們也可使用ansible命令對指定的主機或主機組執行批量的動做,這裏要注意一下,ansible命令可使用Core Modules,可是inventory裏定義的主機變量和組變量不能生效。
命令幫助以下:
➜ inventory ansible --help Usage: ansible <host-pattern> [options]
若是不用-m指定模塊,ansible命令默認使用command模塊。
示例1: 查看nodes主機組的主機名
➜ lab-ansible ansible nodes -a 'hostname' node2 | SUCCESS | rc=0 >> node2 node1 | SUCCESS | rc=0 >> node1
ansible命令也能夠指定不少附加參數,例如指定remote_user(- u)、forks數量(- f)、提權(-b)、提權是否要輸入密碼(--ask-become-pass)等等,其餘參數請使用ansible --help命令查看。
示例2: 使用copy模塊將本地test.txt文件拷貝到目的主機/etc/test.txt,設定使用student用戶登錄,而且要求提權,提權方式爲sudo,要求交互式輸入提權密碼。
➜ lab-ansible ansible nodes -m copy -a 'src=./test.txt dest=/etc/test.txt' --user=student --become --become-user=root --become-method=sudo --ask-sudo-pass
命令行傳入的參數優先級是最高的,包括鏈接參數和變量,關於變量優先級,在後續的「ansible基礎-變量」會詳細闡述。
歡迎你們關注個人公衆號: