Ansible自動化部署工具-元件及語法介紹

藍胖子的程式設計夢發表於2023-11-09

大家好,我是藍胖子,我認為自動化運維要做的事情就是把運維過程中的某些步驟流程化,程式碼化,這樣在以後執行類似的操作的時候就可以解放雙手了,讓程式自動完成。避免出錯,Ansible就是這方面非常好用的工具。它能將我們的安裝軟體,部署等過程進行程式碼編排,程式化我們的部署步驟。今天,我們就來看看它的工作模式以及編排的語法規則。

架構介紹

Ansible 與主機之間溝通的模式是透過ssh協議,執行相關的命令。這其中涉及到Ansible 的組成架構的問題,學習一門技術或工具首先得對它的架構有所瞭解。 我們來看看Ansible的組成架構是什麼樣的。

組成架構

inventory主機清單

inventory清單定義了 Ansible 要管理的主機,當執行Ansible 任務時,需要指定主機清單,預設的主機清單配置是在/etc/ansible/hosts 裡,執行命令的時候也可以透過-i 引數指定主機清單的位置。

主機清單的配置檔案是INI格式的檔案,如下所示, 我配置了一個叫test的機器組,它又兩個機器,分別是159.138.99.123,159.138.99.121,同時可以透過[組名:vars]的形式在下面定義特點組名的變數,下面?? 示例的配置檔案 我就定義了兩個變數ansible_ssh_private_key_file代表連線伺服器時使用的金鑰的位置,ansible_ssh_user代表連線伺服器時的使用者名稱。

[test]  
159.138.99.123
159.138.99.121
[test:vars]  
ansible_ssh_private_key_file=/Users/xiongchuanhong/.ssh/id_rsa  
ansible_ssh_user=webserver

inventory 中的常用變數如下:

ansible_ssh_port: //定義連線主機的ssh埠 
ansible_ssh_user: //定義連線到該主機的ssh使用者 
ansible_ssh_pass: //定義連線到該主機的ssh密碼 
ansible_sudo_pass: //定義sudo的密碼 
ansible_connection: //定義ansibles的連線型別,可以是local、ssh或paramiko ansible_ssh_private_key_file: //定義私鑰檔案路徑

平時使用inventory元件時,我們可以在一個資料夾下建立不同的機器組,如下,我建立了一個hosts資料夾,並且新建了兩個檔案分別存放 生產環境的機器組和測試環境的機器組。檔案的格式是INI格式。

(base) ➜  hosts tree .
.
├── prod
└── test

接著我們可以使用如下命令測試定義的機器組是否有效,-i 後接檔名或資料夾名,然後是機器組的名稱,這裡是test。如果inventory配置正確,那麼會出現對應機器組的ip。

(base) ➜  hosts ansible -i test   test  --list-hosts
  hosts (1):
    159.138.99.123
	159.138.99.121

Ansible 核心元件

我將Ad-hoc元件和playbook,role這些元件都稱為核心元件,因為它們對部署任務的編排有非常緊密的聯絡。在後面我會介紹它們比較詳細的語法,這裡就簡單的提及一下它們之間的區別。

Ad-hoc 命令是直接使用命令列來執行Ansible的任務,命令列也能使用Ansible的模組,如下Ad-hoc命令 使用copy模組複製檔案,-m 後面跟的是模組名稱,-a後面跟的是模組需要執行的命令。

ansible <機器組名稱> -m copy -a "src=/path/to/local/file dest=/path/to/remote/file" 

?? 注意下,這裡說的元件和模組的區別,在Ansible中封裝了很多模組來方便我們完成對應的功能,可以用ansible-doc -l 去檢視一共有哪些模組,關於模組的用法可以檢視文件https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 文件記錄了ansible內建的模組已經用法。

playbook 適用於完成一些複雜的配置部署任務,雖然Ad-hoc能完成部分配置任務,但畢竟是命令列,playbook可以將配置任務文件化。如下透過在一個yaml檔案裡定義任務的執行步驟,然後用ansible-playbook 命令便可以執行site.yml 裡配置的任務了。-i引數指定了inventory主機清單的位置。關於playbook的yml檔案的語法會在接下來語法介紹時詳細闡述。

ansible-playbook site.yml -i hosts/prolinkbox

role 元件針對於playbook編排任務的方式就更進一步,如果有很多不同業務需要編排部署任務,就會產生很多playbook的yml檔案,不好維護。所以透過role元件定義了一些固定的目錄規範存放任務相關的檔案,涉及到任務編排的yml語法和playbook類似,基本沒有變動。

各種外掛

除了上述提到的元件外,Ansible還有很多外掛來讓Ansible額外完成某些功能,比如日誌,郵件功能,另外,Ansible預設的連線主機的方式是ssh,可以透過連線外掛來來支援其他的連線方式。

至此,大致介紹了完了Ansible的組成架構,接著我們詳細看下Ansible編排任務的語法是怎麼樣的,瞭解了語法後,便可以自己編寫Ansible的任務了。

語法介紹

Ad-hoc臨時命令模式

雖然我是極力建議使用Ansible編寫對線上服務的部署任務時,儘量採用playbook方式,這樣能文件化任務。但是一些簡單的命令又想批次的在主機上執行,還是可以用到Ad-hoc方式執行。

我們簡單的看看其使用規則,-m 引數 指定使用的模組,-a 引數指定模組使用到的命令。舉幾個簡單的例子,

使用了shell模組,輸出test機器組中每個linux伺服器的主機名

(base) ➜  boxdev ansible  -i hosts test -m shell -a 'hostname'  
159.138.99.123 | CHANGED | rc=0 >>
hw-sg1-test-0001

使用了copy模組將本地的ReadMe.md 檔案複製到了遠端

(base) ➜  boxdev ansible  -i hosts test -m copy  -a "dest=./ReadMe.md mode=600  src=./ReadMe.md" 

159.138.99.123 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "73072172dcf3a9e8fd75b72a96d859240c65a26f",
    "dest": "./ReadMe.md",
    "gid": 1001,
    "group": "nemo",
    "mode": "0600",
    "owner": "webserver",
    "path": "./ReadMe.md",
    "size": 119,
    "state": "file",
    "uid": 1002
}

Ad-hoc 的使用十分簡單,關鍵都是要掌握Ansible中有哪些模組,各個模組能有哪些引數,具體參考文件 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin

playbook編排模式

接下來,來看下playbook使用yml編排任務時的語法規則。如下是一個yml的示例檔案,

---
- hosts: all
  tasks:
    - name: Install Nginx Package
      yum: name=nginx state=present

    - name: Copy Nginx.conf
      template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0644 validate=' nginx -t -c %s'
	  notify:
		- ReStart Nginx Service

   handlers:
	   - name: ReStart Nginx Service
		 service: name=nginx state=restarted

上面這個檔案足以介紹playbook的基礎語法了首先hosts代表使用到的機器組,all代表主機清單上全部的機器組。

tasks下面定義的是Ansible需要執行的任務,name代表人物的名稱,接著就是Ansible的一些模組,像上面例子中就用到了yum模組,template模組。模組的用法以及需要定義哪些引數和使用Ad-hoc命令時一致。

在任務後面還可以跟notify 配置,它代表在該任務完成後可以執行的額外操作,操作定義在handlers裡,如上面例子那樣,在Copy Nginx.conf任務完成後,執行了ReStart Nginx Service的handler,這個handler被定義在下面handlers的配置裡,也是引用Ansible的模組的方式,使用了service模組啟動nginx服務。

總結

你可以發現,其實用上Ansible並不難,關鍵就是熟練的掌握各種模組的用法,無她,唯手熟爾。關於playbook的語法還涉及到引數定義,role模式的寫法,這些詳細的語法會放到後面的章節在繼續講解,這一節先簡單的知道Ansible是個什麼東西,能看懂很簡單的playbook配置檔案即可。

相關文章