1-Ansible 自動化介紹
Ansible 自動化介紹
手動執行任務和自動化執行任務
手動執行任務的麻煩事:
- 很容易漏掉某個步驟,或者不小心執行錯步驟,而且很難驗證每個步驟是不是真的按預期完成了。
- 管理一大堆服務器時,很容易出現配置不一樣的情況,維護起來特別費勁,還會讓整個 IT 環境變得不穩定,容易出問題。
自動化執行任務的好處:
- 通過統一的標準,能保證所有系統都能快速、正確地完成部署和配置。
- 日常那些重復做的固定任務可以自動執行,這樣就能騰出時間去做更重要的事。
- 應用程序能更快地交付使用。
基礎架構即代碼
- 好的自動化系統能實現 “基礎架構即代碼” 的方法。簡單說,就是用機器能讀懂的自動化語言來描述 IT 基礎架構應該是什么樣子的。最好這種語言人也很容易看懂,這樣就能輕松知道當前狀態,改起來也方便。
- 如果這種自動化語言是用簡單的文本文件寫的,還能放到版本控制系統里管理。這樣一來,每一次修改都會被記錄下來,能看到隨著時間推移做過哪些改動,萬一出問題,還能把系統恢復到之前的配置。這就為遵循 DevOps 理念打下了基礎:開發人員可以用自動化語言定義想要的配置,運維人員能輕松查看這些改動并給出反饋,然后用這個自動化方案重復操作,確保系統狀態符合開發人員的預期。
Ansible (自動化) 與 DevOps (開發和運營)
百度百科:DevOps 是 Development(開發)和 Operations(運維)的組合詞,指的是一系列流程、方法和系統的集合,目的是促進開發(應用程序 / 軟件工程)、技術運營和質量保障(QA)部門之間的溝通、協作與融合。它是一種重視 “軟件開發人員(Dev)” 和 “IT 運維技術人員(Ops)” 之間溝通合作的文化、運動或慣例。通過自動化 “軟件交付” 和 “架構變更” 的流程,讓構建、測試、發布軟件變得更快捷、更頻繁、更可靠。
DevOps 的核心就是 “溝通”。
Ansible 是第一款能在整個 IT 領域被大家讀懂和編寫的自動化語言,也是唯一一個能從頭到尾自動化應用生命周期和持續交付流程的自動化引擎。
什么是 ANSIBLE?
Ansible 是一種簡單的自動化語言,通過 Playbooks(劇本)來描述和配置 IT 基礎架構。
Ansible 能處理各種復雜的自動化任務,適合不同的生產環境。而且,新手也能很快學會并用到實際生產中。
常見用途:
- 搭建和維護 OpenStack
- 搭建和維護 OpenShift
- 搭建和維護 ceph
Ansible 特點
- 簡單易學:Ansible Playbooks 是文本文件,特別容易查看、理解和修改,用戶不用懂復雜的編程技能。
- 功能強大:能用 Ansible 部署應用,比如做配置管理、工作流自動化、網絡自動化,還能編排整個應用的生命周期。
- 無代理架構:Ansible 不需要在被管理的主機上裝代理,它通過OpenSSH或者 WinRM 連接到這些主機,然后把一些小程序(Ansible 模塊)推送到主機上。這些小程序用來把系統設置成我們想要的狀態。任務完成后,推送的模塊會被自動刪除。正因為被管理的主機上不用裝特殊代理,Ansible 用起來更高效、更安全。
- 跨平臺支持:能管理 Linux、UNIX、Windows 系統和各種網絡設備。
- 精準描述應用:Ansible Playbook 用 YAML 格式來描述生產環境的狀態。
- 支持版本控制:Ansible Playbooks 和項目都是純文本格式,可以像源代碼一樣存到版本控制系統里。
- 易于集成:能和 HP SA、Puppet、Jenkins、紅帽衛星服務器等其他系統輕松集成。
Ansible 概念和架構
-
節點(NODES)
:Ansible 架構里有兩種計算機:
- 控制節點:裝了 ansible 軟件的節點。
- 受管節點:被 ansible 管理的 Linux 系統、Windows 系統、網絡設備等。
-
清單(INVENTORY):記錄所有被管理主機的列表。
-
劇本(PLAYBOOK)
:用戶只需要寫好 Playbook,Ansible 就會確保主機達到預期狀態。
- 每個 playbook 里可以包含多個 “劇本片段(play)”。
- 每個 play 會在一組主機上按順序執行一系列 “任務(task)”。
- 每個 task 都要執行一個 “模塊(module)”。模塊是一小段代碼(可能是 Python、PowerShell 或其他語言寫的)。Ansible 自帶幾百個模塊,能執行各種自動化任務,比如操作系統文件、安裝軟件、調用 API 等。Tasks、plays 和 Playbooks 具有 “冪等性”—— 在同一臺主機上多次安全執行 Playbooks,最終主機都會處于正確狀態。如果主機已經是預期狀態,Playbook 就不會做任何改動。
-
插件(PLUGINS):添加到 Ansible 里的代碼片段,用來擴展 Ansible 的功能。
Ansible 理念
- 復雜會降低效率:越簡單越好。Ansible 的設計原則就是讓工具好用、自動化腳本好寫好懂,所以創建自動化時要盡量簡單。
- 優先保證可讀性:Ansible 自動化語言圍繞簡單易懂的聲明性文本文件構建。寫得好的 Ansible Playbook 能清晰記錄工作流的自動化過程。
- 用聲明式思維:Ansible 是一種 “目標狀態引擎”。它解決 IT 部署自動化的思路是:你只需要說明希望系統處于什么狀態,Ansible 會通過只做必要的改動,讓系統達到這個狀態。
Ansible 用例
- 配置管理:集中管理和部署配置文件是 Ansible 的常見用法,很多高級用戶都是從這里開始了解 Ansible 自動化平臺的。
- 應用部署:用 Ansible 定義應用,再結合紅帽 Ansible Tower 管理部署,各個團隊能更高效地管理從開發到生產的整個應用生命周期。
- 工作流管理:Ansible 和紅帽 Ansible Tower 能簡化系統配置流程,不管是通過 PXE 引導和 kickstart 安裝裸機恢復服務器、虛擬機,還是從模板創建虛擬機或云實例,都能輕松搞定。
- 持續交付:創建 CI/CD 流水線需要多個團隊配合。如果沒有一個團隊里所有人都能用的簡單自動化平臺,這很難實現。Ansible Playbook 能確保應用在整個生命周期內都被正確部署和管理。
- 安全與合規:在 Ansible Playbook 里定義安全策略后,還能把掃描和修復安全策略的操作集成到其他自動化流程中。安全應該是所有部署中必不可少的部分,而不是事后才考慮的事情。
- 編排:只配置單個部分不足以定義整個環境,還需要明確多個配置之間如何交互,確保各種分散的資源能被整體管理。
Ansible 部署
準備實驗環境
實驗環境的 /etc/hosts 配置
10.1.8.10 controller.bq.cloud controller
10.1.8.11 node1.bq.cloud node1
10.1.8.12 node2.bq.cloud node2
10.1.8.13 node3.bq.cloud node3
10.1.8.14 node4.bq.cloud node4
需要配置控制節點的 bq 用戶能免密碼登錄所有節點,并且不用輸入密碼就能通過 sudo 獲取權限執行任何命令。
# 所有節點都配置/etc/hosts
[root@all-node ~]# cat >> /etc/hosts <<EOF################# ansible #################
10.1.8.10 controller.bq.cloud controller
10.1.8.11 node1.bq.cloud node1
10.1.8.12 node2.bq.cloud node2
10.1.8.13 node3.bq.cloud node3
10.1.8.14 node4.bq.cloud node4
EOF# 所有節點添加用戶
[root@all-node ~]# useradd bq
[root@all-node ~]# echo redhat | passwd --stdin bq# 所有節點配置免密提權
[root@all-node ~]# echo 'bq ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/bq# 創建密鑰對
[bq@centos7 ~]$ [ -d ~/.ssh ] || mkdir -m 700 .ssh
[bq@centos7 ~]$ ssh-keygen -t rsa -f .ssh/id_rsa -N ''# 推送公鑰到目標主機
[bq@centos7 ~]$ sudo yum install -y sshpass
[bq@centos7 ~]$ for host in controller node{1..4}
do sshpass -p redhat ssh-copy-id bq@$host
done# 驗證免密登錄
[bq@centos7 ~]$ for host in controller node{1..4}
do sshpass -p bq@$host hostname
done
控制節點
控制節點就是安裝了 Ansible 軟件的主機。可以有一個或多個控制節點,被 Ansible 管理的主機不需要安裝 Ansible。
注意:控制節點必須是 Linux 或 UNIX 系統,不支持 Windows 作為控制節點。
安裝 ansible:
[bq@centos7 ~]$ sudo yum install -y ansible
[bq@centos7 ~]$ ansible --version
ansible 2.9.27config file = /etc/ansible/ansible.cfgconfigured module search path = [u'/home/bq/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python2.7/site-packages/ansibleexecutable location = /bin/ansiblepython version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
受管節點
Linux
受管節點需要滿足的條件,取決于控制節點連接它們的方式以及要運行的模塊:
- Python 版本:Linux 和 UNIX 受管節點需要安裝 Python,才能運行大部分模塊。
- 有些模塊不需要 Python:比如 raw 模塊,它的參數直接通過配置的遠程 shell 運行,可以在沒有 Python 環境的設備上使用。不過,raw 模塊很難用安全的冪等方式操作。
Windows
Ansible 自帶很多專門為 Microsoft Windows 系統設計的模塊,這些模塊可以在 Ansible 模塊索引的Windows Modules部分查到。
大部分專門為 Microsoft Windows 受管節點設計的模塊,要求受管節點上:
- 安裝 PowerShell 3.0 或更高版本。
- 配置 PowerShell 遠程連接。
- 安裝.NET Framework 4.0 或更高版本。
本課程的示例用的是基于 Linux 的受管節點,不會詳細講管理 Microsoft Windows 受管節點的具體區別和必要設置。想了解更多可以去Ansible 官網查看。
網絡設備
也可以用 Ansible 來自動化配置受管網絡設備,比如路由器和交換機。Ansible 包含很多專門為此設計的模塊,支持 Cisco IOS、IOSXR、NX-OS,Juniper Junos,Arista EOS,以及基于 VyOS 的網絡設備等。
由于大多數網絡設備不能運行 Python,所以 Ansible 的網絡模塊是在控制節點上運行的,而不是在受管節點上。和網絡設備通信會用特殊的連接方式,通常是通過 SSH 上的 CLI、SSH 上的 XML 或者 HTTP (S) 上的 API。
isco IOS、IOSXR、NX-OS,Juniper Junos,Arista EOS,以及基于 VyOS 的網絡設備等。
由于大多數網絡設備不能運行 Python,所以 Ansible 的網絡模塊是在控制節點上運行的,而不是在受管節點上。和網絡設備通信會用特殊的連接方式,通常是通過 SSH 上的 CLI、SSH 上的 XML 或者 HTTP (S) 上的 API。
如涉及版權問題,請聯系作者處理!!!!!!!!!