大家好,我是藍胖子,我認為自動化運維要做的事情就是把運維過程中的某些步驟流程化,程式碼化,這樣在以後執行類似的操作的時候就可以解放雙手了,讓程式自動完成。避免出錯,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配置檔案即可。