ansible簡介
今天我打算講講ansible,從網絡的角度去看看ansible到底為什么這么火,同時也結合筆者自己的一些經歷來看ansible有哪些局限。
去網上看ansible的資料,基本都是互相抄來抄去,再舉幾個自己的例子。這次我希望能有所突破,給大家一個不同視角的ansible。
本來想寫成一篇,結果發現越想寫,很多細節和坑都想給大家講明白,所以計划兩期 3-5期
- 先帶大家看看ansible,以及如何用ansible的raw模塊對網絡設備批量執行單條命令。
- 如何用各廠商對應的cli模塊去執行命令
- 如何用playbook編排任務
- 復雜的playbook使用指南(這個就是簡單引路了大家按需自己去學)
- 本文是基於ansible2.9.9的版本,python3.8
- 我的分享會從網工角度去分享如何使用
- 從源碼角度分析ansible為什么易上手,難在哪里,坑在哪里。總之就是多維度解讀。
- 漁與魚並重
初識ansible
ansible是一個配置管理和應用部署工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric、SaltStack )的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
以上這段話,大家互相抄來抄去,本來也是我內部培訓時的一段,這次我換個角度來解讀一下
ansible是一個配置管理和應用部署工具
- ansible可以去對服務器上(1-N台)的一些系統應用進行配置管理,更該部分參數。
- ansible可以去安裝一個新的軟件應用,或者是一組軟件應用。
以上本質是在多設備按情況(判斷循環)指定每台設備要執行的命令(命令可封裝成更加簡單的模塊,調用更方便)
集合了眾多運維工具的優點
借鑒了很多的特
點,改善了很多缺點,
- 輕量化:控制端無需安裝一些數據庫或者其他服務,被控制端無需安裝agent。這點很重要,13年的時候我用過chef,安裝不友好,被控制端配置的也很煩,非常重的一個東西。
- 簡單易學:通過yaml描述靈活調用模塊、編排任務實現配置管理和部署應用,理論上不學開發也可使用。而其他或多或少依賴ruby、shell等,學習成本相對較少。
- 可拓展性強,又可通過Python(或者其他語言,但肯定Python是最佳)二次開發實現很多自己的功能,編寫自己的模塊。
適用范圍廣
- 功能:依托於ansible的模塊(自帶很多,又可定制)實現非常豐富的功能,比如安裝數據庫、配置交換機端口vlan等等。
- 覆蓋:可覆蓋windows server 、linux 、網絡設備。(理論上ssh可用,都可無侵入的使用ansible)
社區活躍,廠家支持
這點也很重要,從官方到社區、從民間到廠家都很支持,眾多案例分享,資料多,發展快,這就是一個滾雪球的過程。
基於SSH,但是不止於SSH
基於ssh,致使適用范圍廣,但是自己寫的接口只要對接上,也可以通過RESTful API 、Netconf等協議與設備交互。
以上是我對ansible的一些解讀。
當然還有大家提到的安全可靠,冪等一致(執行一次和N次結果一樣)。
插一句,名字來源:安德魯的游戲,科幻小說,前幾年的一部電影,是一個控制器可以控制XX光年以外的一些設備還是飛船之類的,很貼合運維。
有些資料提到可實現多級指揮,strong multi-tier solution。我理解的是付費版本可以實現類似多區域部署探針,由ansible tower統一控制。
架構組成
1.connectior plugins (連接插件):用於連接主機,用來連接被管理端
2.core modules (核心模塊):連接主機實現操作,它依賴於具體的模塊來做具體的事情
3.custom modules (自定義模塊):根據自己的需求編寫具體的模塊。
4.plugins (插件):完成模塊功能的補充
5.playbooks(劇本):ansible的配置文件,將多個任務定義在劇本中,由ansible自動執行。大家很大一部分都是在寫playbook。
6.host inventory (主機清單):定義ansible需要操作主機(網絡設備、控制器、可以對接ansible的第三方軟件控制器)的范圍,這個其實相當於一個簡單文件描述的CMDB,可以對設備打標簽、角色等等,可以在一些場景下篩選設備,不同設備執行不同的命令。這段大家可以細細看看ansible的一些官方文檔
安裝
系統要求:server端只能是Linux。windows端可以通過wsl,調用linux系統然后安裝ansible(香,我用的是這種方法)
軟件要求:python>=2.6 目前已經支持3.X版本,也強烈建議大家使用3.6及以上版本。不要使用過老的Python版本。不要提上古版本2.X了。
安裝命令:yum install ansible 或者是pip install ansible。推薦大家pip安裝,同時強烈建議大家關注一下你的pip在你安裝的哪個Python路徑下。
其他軟件要求:Linux可能需要安裝sshpass(因為ansible默認使用ssh進行連接)
配置文件
所在位置:/etc/ansible/ansible.cfg
可以通過ansible --version看默認的配置路徑和版本信息、查找核心模塊modules路徑。
Ansible中的某些設置可通過配置文件(ansible.cfg)進行調整。對於大多數用戶來說,庫存配置應該足夠了,但可能有其他原因要更改它們。比如主機清單的位置,系統默認的ssh端口號都可以設置,單一般默認的足夠了。
我在使用舊版本的時候會自動生成一個配置文件,后面的新版本沒有再生成,我懷疑是寫死在了ansible的Python腳本之中。
當然我們可以用命令生成到指定位置
比如我這個是把整個配置導出到一個文件中,大家也可以導入到默認的位置(如果默認位置無)
ansible-config dump 命令導出
關於字段的解讀大家可以去搜搜,給大家一個比較全的參考。
還是看官網吧,也可以自己百度,但是不保證版本升級,很多參數能對上。敏捷的原因,和新的考慮,導致向下兼容總有一些取舍。
官方文檔實在是學習的一個非常好的途徑,Python、netmiko、requests、django、drf(非常優秀的RESTful框架)、ansible等等很多官方文檔都寫的很詳細。每次讀起來都覺得酣暢淋漓。
言歸正傳,我的稍微修改了一下配置。
- 第一個是關閉第一次使用ansible連接客戶端是輸入命令提示,省事。
- 第二個是執行命令的超時時間,比如保存配置,設備比較老舊或者網絡不太好(我用的devnet的實驗環境)會超時,避免這種情況。
安裝好,根據情況調整配置后,我們可以開始寫ansible了。
基於Ad-hoc運行批量執行命令
ad-hoc是一種快速模式,用於快速執行ansible的功能模塊,執行的部分不用保存到文件(相對於playbook編排任務的文件)。
在執行之前,首先你需要一個主機清單,用於指定在哪些主機上運行ansible,剛才也說了,這是ansible的一個CMDB資產庫,描述了你有哪些設備、類型、角色、廠商、用戶名密碼等等。
主機清單inventory
所在位置:/etc/ansible/hosts,也可以根據自己的需求更改位置)。
既然是批量管理主機,那么就需要有管理對象,主機清單里寫的都是被管理的主機,而且可以分組,每組都可以傳遞指定參數。
樣例:
[root@master / 22:48:58]#cat /etc/ansible/hosts [ceshi] -->【分組,組名】 10.0.0.11 # 一律使用默認的參數 10.0.0.13 10.0.0.14 [ceshi2] -->【分組,組名】 10.0.0.15 10.0.0.16 10.0.0.17 [ceshi2:vars] -->【可傳一些變量,有一些系統變量,也可以自定義變量】 ansible_password='密碼' -->【加上這個就不用輸入密碼,也不用密鑰,但是真心不建議密碼明文寫在這里】 ansible_port=22 ansible_user='test'可設置登錄用戶 [ceshi3] -->【分組,組名】 10.0.0.18 ansible_password='密碼' ansible_port=22 10.0.0.19 ansible_password='密碼' ansible_port=22 10.0.0.20 ansible_password='密碼' ansible_port=22 ceshi2的變量會與ceshi2的設備相互關聯。
inventory支持的內置參數,一些基本的連接用的。
ansible_port # 端口號默認是22 ansible_user # ssh連接時默認使用的用戶名 ansible_password # ssh的密碼
同時主機清單可以通過文件夾目錄的方式保存,可以通過腳本動態獲取。非常靈活。
網絡設備配置還有其他需要注意的參數,我們一會介紹。
網絡設備不同於Linux,所以很多網上的例子(最簡單執行命令的那種)放在網絡設備上也是行不通的。很多博文其實沒講清楚。
今天我們來講講其中的坑,這可得打好多字…今天也是豁出去了
SSH設備用RAW模塊執行命令
我們首先有一個設備清單。
文件名:hosts (沒有后綴)
[cisco_nxos] sbx-nxos-mgmt.cisco.com ansible_port=8181 ansible_user=admin [cisco_nxos] sbx-nxos-mgmt.cisco.com [cisco_nxos:vars] ansible_port=8181 ansible_user=admin
兩種寫法,大家按需選取。
我們實際運行的清單如下:
[cisco_nxos] sbx-nxos-mgmt.cisco.com [cisco_ios] sbx-iosxr-mgmt.cisco.com [cisco_nxos:vars] ansible_port=8181 ansible_user=admin ansible_password=XXX [cisco_ios:vars] ansible_port=8181 ansible_user=admin ansible_password=XXX
我們執行了命令:
ansible -i hosts_v2 all -m raw -a "show version" -k
ansible 代表用了ad-hoc模式
-u admin 可以指定用admin登錄,由於我們配置文件里已經寫了,大家按需用默認的或者自己指定的。
-i 指定設備清單文件,默認是使用ansible.cfg中的路徑文件。后面跟的是hosts文件,我們故意寫了一個不是hosts的。all代表的是所有設備。也可以指定分組。
-m 是調用模塊的意思,module。我們調用了raw模塊,一會我們細細聊聊這個raw模塊。
-a 是arguments,給模塊傳入參數的意思。我們傳入的是一個命令。
-k 是代碼ask-pass ,詢問密碼,輸入密碼執行。也可以寫在hosts中ansible_password,這個和密碼是否一致有關系。網絡設備我們極少配置密鑰。
執行所有設備 host文件后跟all
執行某組設備,后跟cisco_nxos分組名
綠色代表是成功但沒改變配置,黃色是代表成功狀態配置改變,紅色代表失敗。
網絡設備在raw模式下,返回是有問題的,認為每條命令都發生了變化。但是實際上show是不會發生變化的。
返回的數據看起來是有字段的,如果再Python里執行會返回結構化數據(host 狀態 回顯等字段,但是show的內容不是結構化的,還是文本。)
其他說明
以上我們學習了如何批量執行網絡設備的命令。調用了raw模塊。
我們來看看raw模塊,在對應得到Python路徑下,我們看到了raw還有其他很多模塊。
其中Linux用的最多的是command、shell 、script。
我們來簡單嘮嘮其中的分別。
- raw相當於ssh到設備執行命令, Executes a low-down and dirty command,是比較通用低級的。不局限於Linux Windows 網絡設備,只要支持ssh理論上都是可以用ansible管理的,這也是ansible被廣泛使用的原因之一,覆蓋范圍很廣,老舊通吃。
- 其他幾種(command、shell 、script)是基於Linux的內核設計使用的,command最常用,是執行命令的,但也受限制,比如不能使用一些環境變量,無法使用一些管道符之類的。shell彌補了這部分。script專職執行腳本的。
- windows可以用raw和win_command和psexec等模塊。
我們使用的時候
ansible -i hosts_v2 all -m raw -a "show version" -k
調用了raw模塊,傳入了參數即執行的命令,一次一條。借助playbook可以實現多條。
這個ad-hoc模式每次只能執行一個ansible模塊,raw這個模塊我暫時沒找到一次傳入多條的方式。這種只是適合演示一下,我們可以和網絡設備交互。實際上還是需要借助playbook模式去執行多行命令。但是也有坑,比如有時候保存的時候讓你輸入yes 、no(raw模塊) 就不行了。
當然我們有其他方法。
raw模塊我傳入一個帶換行的文本執行多條命令在nxos上也是執行失敗的。
raw只是認識ansible路上的一個指路明燈,讓我們快速執行命令,看到陽光。
查看模塊使用說明:
看Python源文件
我們可以全局搜對應模塊名.py,鎖定路徑,進去看看Python模塊的描述,就知道怎么用了。
描述:
使用例子: