Ansible自动化部署工具-组件及语法介绍
大家好,我是藍胖子,我認為自動化運維要做的事情就是把運維過程中的某些步驟流程化,代碼化,這樣在以后執行類似的操作的時候就可以解放雙手了,讓程序自動完成。避免出錯,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配置文件即可。
總結
以上是生活随笔為你收集整理的Ansible自动化部署工具-组件及语法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC并发编程学习笔记(十七)彻底玩转单
- 下一篇: Kubernetes:kube-apis