天天看點

Ansible基礎知識

Ansible是什麼?

Ansible是一個開源自動化運維平台。Ansible是一個可以在Ansible Playbook中完美描述IT應用架構的簡單的自動化語言。它也是一個運作Ansible Playbook的自動化引擎。

Ansible可以管理強大的自動化任務,并且可以适應許多不同的工作流和環境。同時,Ansible的新使用者可以非常快速的使用它并将其帶入生産環境。

Ansible是Python寫的,是Agentless(無代理),建議在中小型環境中使用。

Ansible的核心理念就是一個主機(主要端)能夠控制多台别的主機(被控端)。

Ansible如果在大型環境中使用,也就是被控端特别多的情況下,那麼速度效率就會非常的慢。

相比之下,SaltStack(也非常流行)也是Python寫的,一般需要部署agent(也可以叫做代理),由于使用了代理,是以其執行的效率更高,比起Ansible高多了。

Ansible的特點?

1、簡單

Ansible Playbook是容易了解的,容易看懂的。Playbook是非常容易了解和修改的自動化工具。不需要特别複雜的程式設計能力就可以寫Playbook。Playbook按照順序執行task。Playbook簡單涉及讓每個團隊都能很容易的上手使用。

2、強大

你可以使用Ansible來部署應用,進行配置管理,工作流自動化運維,網絡自動化運維。Ansible可用于協調整個應用程式生命周期。

3、無代理

Ansible是一種無代理的架構。通常,Ansible通過使用OpenSSH或WinRM來連接配接到被管理的主機并且經常(但不全是)通過向被管理主機推送叫Ansible子產品的小程式來運作task。這些程式用于将系統至于特定的期望狀态。任何被推送的子產品當Ansible任務執行完成之後會被移除。你可以很快的上手Ansible,因為Ansible在被管理主機上不需要任何特殊的代理。因為被控端沒有代理,是以Ansible是更高效(這裡的高效指的是不用刻意花費時間部署agent)的并且比其它的自動化運維工具更安全。

Ansible的優勢?

1、跨平台支援

Ansible的無代理特性支援Linux、Windows、Unix、Mac和網絡裝置,無論實體機、虛拟機、雲主機和容器環境都可以支援

2、容易懂、容易上手

被寫成YAML的text檔案的Ansible Playbook是容易懂的,并且能夠幫助任何人快速了解并上手

3、完美應用描述

Ansible Playbook可以進行任何更改,并且可以描述和記錄應用程式環境的各個方面

4、簡單的版本管理

Ansible Playbook和Project是明文的text(也可以加密),它們可以像代碼一樣對待并放置在現有的版本控制系統中

5、支援動态的Inventories

Ansible管理的計算機清單可以從外部源動态更新,以便始終捕獲所有托管伺服器的正确最新清單,無論基礎架構或者位置如何

6、與其它系統輕松內建的編排

HP SA、Puppet、Jenkins、Red Hat Satellite和其它的在你環境中的系統都可以被內建到你的Ansible中

Ansible:DevOps的語言?

開發測試,問答測試,操作,管理,外包,交流是DevOps的關鍵。

Ansible是第一種可以跨IT讀寫的自動化語言,它也是唯一能夠從開始到結束自動化應用程式生命周期和連續傳遞管道的自動化引擎。

Ansible概念和架構?

1、控制節點

在Ansible的架構中有兩種類型的機器,一類是控制節點(主要端),一類是被管理主機(被控端)。Ansible被安裝并且運作在控制節點上(主要端),并且這類機器上有你的項目檔案的副本。控制節點是管理者的筆記本,也可以是一個被很多管理者共同使用的系統,也可以是一個運作Ansible Tower的伺服器。

2、被管理主機-Inventory

被管理主機被列在Inventory中,Inventory将這些被管理主機組織進不同的group中進行管理,Inventory可以被定義在靜态的text檔案中,或者被定義在動态的腳本中。

3、Playbook

不用寫複雜的腳本,Ansible使用者建立高等級的Play來保證主機處在特定的狀态。一個劇本在一個主機上執行一系列的任務,這些劇本在text檔案中被表達為YAML的格式,包含一個或更多的Play叫做Playbook。

4、Task

每個Task運作一個帶着特定參數的Module,每個Module都是一段很少的代碼,該代碼可以用Python、PowerShell或者其它的語言來編寫。每個子產品本質上都是工具包中的工具。Ansible附帶了一千多個可用于執行各種自動化任務的有用子產品。這些子產品可以用來操控系統中的檔案,安裝軟體或者做系統調用。

5、安全的多次運作-幂等性

當在Task中使用子產品時,子產品通常確定關于機器的某些特定事物處于特定狀态。例如,當Task使用子產品來确定一個檔案是否存在,或者是否有特定的權限和内容,而使用不同子產品的任務可以確定挂載了特定的檔案系統。如果系統不在那個狀态,Task會将系統設定成那個狀态。如果系統已經處在了那個狀态,它将什麼都不會做。如果一個Task失敗了,Ansible的預設行為是為失敗的主機終止剩餘的劇本,并且復原到主機沒有跑Ansible Task之前的狀态。Task、Play和Playbook是幂等性的。你可以在同樣的主機上安全的運作多次同樣的Task、Play和Playbook,并且當你的系統處在正确的狀态時,Task、Play和Playbook運作後将不會對被控端做任何改變。

6、Ansible插件

ansible插件是增強ansible的核心功能的代碼片段,ansible使用插件架構來實作豐富,靈活和可擴充的功能集。Ansible提供了許多友善的插件,也可以輕松編寫自己的插件。

7、Ansible架構

Ansible架構是無代理的。通常,當一個管理者運作一個Ansible Playbook或者Ad Hoc指令時,主要端通過使用OpenSSH或者WinRM來連接配接到被控端。這意味着在被控端不必安裝特定的代理軟體,并且不必允許特殊的網絡流量傳輸到非标準端口。

8、Ansible Tower

紅帽的Ansible Tower是一個幫助你增加安全、控制力和擴充性的企業架構。你可以使用它來控制誰能接入并且在你的主機上運作playbook,不必使用者傳輸或者看到内容就能共享OpenSSH憑據,記錄所有的Ansible工作日志,管理Inventory等等。它提供一個基于Web的UI和Restful的API。它不是Ansible的核心元件,卻是一個幫助你高效使用Ansible的産品。

9、Ansible的工作方式(圖檔)

Ansible的特性?

1、子產品化

調用特定的子產品,完成特定的任務

2、有3大關鍵子產品

Paramiko、PyYAML、Jinja2

3、支援自定義子產品

可自己編寫子產品

4、基于Python語言實作

目前是Python2版本,不支援Python3版本

5、部署簡單

基于Python和OpenSSH(預設已安裝),無代理

6、安全

基于OpenSSH

7、支援playbook編排任務

友善、簡單

8、幂等性

即一個任務執行一遍和執行n遍效果一樣,不因重複執行帶來意外情況

9、無需代理

不依賴PKI(無需ssl)

10、可使用任何程式設計語言寫子產品

支援多語言編寫子產品

11、YAML格式

編排任務時支援豐富的資料結構

12、較強大的多層解決方案

支援role方式,更合理和高效的利用playbook

Ansible主要組成部分?

1、Ansible Playbook

任務劇本(任務集),編排定義Ansible任務集的配置檔案,由Ansible順序依次執行,通常是Json格式的YML檔案

2、Inventroy

Ansible管理主機的清單,預設是/etc/ansible/hosts

3、Modules

Ansible執行指令的功能子產品,多數為内置核心子產品,也可以自定義

4、Plugins

子產品功能的補充,如連接配接類型插件、循環插件、變量插件、過濾插件等,該功能不常用

5、Api

供第三方程式調用的應用程式程式設計接口

6、Ansible

組合Inventory、Api、Modules、Plugins的綠框,可以了解為ansible指令工具,其為核心執行工具

Ansible主要操作對象?

1、Hosts主機

即Linux、Mac、Windows、虛拟機、雲主機或者容器化主機

2、Networking網絡裝置

路由器和交換機等

3、注意事項

1、執行ansible的主機一般稱為主要端,中控,master、堡壘機或者控制節點

2、主要端Python版本需要2.6或者以上

3、被控端Python版本小于2.4需要安裝python-simplejson

4、被控端如開啟SELinux需要安裝libselinux-python

5、Windows不能作為主要端

6、如果被控端是Windows,那麼必須在Windows上安裝0.2.2或者更新版本的Python-winrm

7、如果被控端是Windows,那麼需要使用PowerShell 3.0或者更新的版本而不是Python,除此之外被控端的PowerShell需要有遠端配置

利用Ansible實作管理的方式?

1、Ad-Hoc

即ansible單條指令,主要用于臨時場景使用

2、Ansible-Playbook

主要用于長期規劃好的,大型項目的場景,需要有前提的規劃

3、Role

Role是一種特殊的Ansible-Playbook方式

Ansible指令執行來源?

1、User

普通使用者,即System Admin

2、Cmdb

配置管理資料庫,Api調用

3、Public/Private Cloud Api調用

即被雲端的Api調用

4、User -> Ansible Playbook -> Ansible

使用者使用Ansible Playbook,然後調用Ansible

Ansible-Playbook執行過程?

1、将已有編排好的任務集寫入Ansible-Playbook

2、通過ansible-playbook指令分拆任務集至逐條ansible指令,按預定規則逐條執行

如何初始化Ansible?

1、檢視Python版本,確定Python版本可用

yum list installed python

2、安裝Python(如有必要)

yum install -y python

3、安裝epel源(Ansible是在EPEL源中的軟體包)

yum install -y epel

4、安裝Ansible

yum install -y ansible

Ansible查找配置檔案的優先級順序?

1、$ANSIBLE_CONFIG

2、./ansible.cfg

3、~<目前使用者>/.ansible.cfg

4、/etc/ansible/ansible.cfg

Inventory檔案的定義?

Inventory檔案定義了一系列被管理的主機,這些被管理的主機可以被放到group中。group可以包含child group,并且一個主機可以屬于多個組,Inventory檔案中也可以設定變量來指定主機群組。

Inventory檔案的種類?

Inventory檔案分為靜态和動态兩種,動态的Inventory可以被腳本生成或者其它的程式生成。

什麼是靜态Invenrtory檔案?

靜态Inventory檔案和Windows的ini檔案很類似。靜态Inventory檔案可以通過主機名或者ip位址來指定被管理主機,每行代表一個主機。

靜态Inventory檔案的正常寫法?

1、正常寫法

web1.example.com

web2.example.com

db1.example.com

db2.example.com

192.168.1.1

2、主機組

[websrvs]

[dbsrvs]

3、被管理主機可以在多個組中

[production]

4、兩個一定存在的組

all:表示每個Inventory中的主機(不重複)

ungrouped:不在任何主機組中的主機

5、嵌套組

":children"表示嵌套組

[production:children]

websrvs

dbsrvs

6、一個組可以同時有被管理主機和children組

192.168.1.2

注意,[production:children]下跟的是組,[production]下跟的是主機,在輸出production組中的主機時,前2個内容會合并後再輸出。

7、指定範圍主機

192.168.[4:7].[0:255],比對192.168.4.0/22

server[01:20].example.com,比對server01.example.com到server20.example.com,注意不會比對server1.example.com

2001:db8::[a:f],比對所有從2001:db8::a到2001:db8::f的位址

如何指定使用靜态Inventory檔案?

ansible和ansible-playbook都可以使用"-i"來指定Inventory檔案的位置。

如何使用ansible指令來檢視host?

ansible <組名> -i <指定inventory路徑> --list-hosts

ansible <組名> --list-hosts,此處使用預設Inventory

如何更好的管理Ansible的版本管理?

ansible.cfg檔案指定了Inventory檔案的位置,通常可以将ansible.cfg、Inventory檔案和Playbook放置到同一個目錄中,這樣就容易實作版本管理。

如何檢視Ansible版本?(順帶還可以檢視目前使用的配置檔案)

ansible --version

目前使用哪個配置檔案,這條指令很實用,也很有必要。

如何配置被管理主機的連接配接?

1、使用哪個Inventory檔案。

在特定的目錄下,建立ansible.cfg檔案,編寫如下資訊:

[defaults]

inventory = ./inventory

2、使用什麼連接配接協定(預設是ssh),使用什麼端口

3、使用什麼使用者

remote_user = root

ask_pass = true -> 提示輸入ssh密碼(即便已經配置了免密鑰登入,還是要輸入密碼),如果是false,則是不需要密碼,要使用密碼方式登入了

4、如果一個使用者沒有特殊權限,是否需要做提權操作,例如使用sudo提升到root

5、是否提示輸入ssh密碼或者輸入root密碼來獲得提權

Ansible的權限提升?

為了安全考慮,Ansible可能通過非root使用者來連接配接被管理主機。那麼如果要在被管理主機上執行管理操作就需要提升到root權限。這個可以在[privilege_escalation]部分被設定。

remote_user = someuser

ask_pass = false

繼續閱讀