Ansible自动化部署工具-组件及语法介绍
大家好,我是藍胖子,我認為自動化運維要做的事情就是把運維過程中的某些步驟流程化,代碼化,這樣在以后執(zhí)行類似的操作的時候就可以解放雙手了,讓程序自動完成。避免出錯,Ansible就是這方面非常好用的工具。它能將我們的安裝軟件,部署等過程進行代碼編排,程序化我們的部署步驟。今天,我們就來看看它的工作模式以及編排的語法規(guī)則。
架構(gòu)介紹
Ansible 與主機之間溝通的模式是通過ssh協(xié)議,執(zhí)行相關(guān)的命令。這其中涉及到Ansible 的組成架構(gòu)的問題,學習一門技術(shù)或工具首先得對它的架構(gòu)有所了解。 我們來看看Ansible的組成架構(gòu)是什么樣的。
組成架構(gòu)
inventory主機清單
inventory清單定義了 Ansible 要管理的主機,當執(zhí)行Ansible 任務(wù)時,需要指定主機清單,默認的主機清單配置是在/etc/ansible/hosts 里,執(zhí)行命令的時候也可以通過-i 參數(shù)指定主機清單的位置。
主機清單的配置文件是INI格式的文件,如下所示, 我配置了一個叫test的機器組,它又兩個機器,分別是159.138.99.123,159.138.99.121,同時可以通過[組名:vars]的形式在下面定義特點組名的變量,下面???? 示例的配置文件 我就定義了兩個變量ansible_ssh_private_key_file代表連接服務(wù)器時使用的密鑰的位置,ansible_ssh_user代表連接服務(wù)器時的用戶名。
[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組件時,我們可以在一個文件夾下創(chuàng)建不同的機器組,如下,我創(chuàng)建了一個hosts文件夾,并且新建了兩個文件分別存放 生產(chǎn)環(huán)境的機器組和測試環(huán)境的機器組。文件的格式是INI格式。
(base) ?  hosts tree .
.
├── prod
└── test
接著我們可以使用如下命令測試定義的機器組是否有效,-i 后接文件名或文件夾名,然后是機器組的名稱,這里是test。如果inventory配置正確,那么會出現(xiàn)對應(yīng)機器組的ip。
(base) ?  hosts ansible -i test   test  --list-hosts
  hosts (1):
    159.138.99.123
	159.138.99.121
Ansible 核心組件
我將Ad-hoc組件和playbook,role這些組件都稱為核心組件,因為它們對部署任務(wù)的編排有非常緊密的聯(lián)系。在后面我會介紹它們比較詳細的語法,這里就簡單的提及一下它們之間的區(qū)別。
Ad-hoc 命令是直接使用命令行來執(zhí)行Ansible的任務(wù),命令行也能使用Ansible的模塊,如下Ad-hoc命令 使用copy模塊復(fù)制文件,-m 后面跟的是模塊名稱,-a后面跟的是模塊需要執(zhí)行的命令。
ansible <機器組名稱> -m copy -a "src=/path/to/local/file dest=/path/to/remote/file" 
???? 注意下,這里說的組件和模塊的區(qū)別,在Ansible中封裝了很多模塊來方便我們完成對應(yīng)的功能,可以用ansible-doc -l 去查看一共有哪些模塊,關(guān)于模塊的用法可以查看文檔https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 文檔記錄了ansible內(nèi)置的模塊已經(jīng)用法。
playbook 適用于完成一些復(fù)雜的配置部署任務(wù),雖然Ad-hoc能完成部分配置任務(wù),但畢竟是命令行,playbook可以將配置任務(wù)文檔化。如下通過在一個yaml文件里定義任務(wù)的執(zhí)行步驟,然后用ansible-playbook 命令便可以執(zhí)行site.yml 里配置的任務(wù)了。-i參數(shù)指定了inventory主機清單的位置。關(guān)于playbook的yml文件的語法會在接下來語法介紹時詳細闡述。
ansible-playbook site.yml -i hosts/prolinkbox
role 組件針對于playbook編排任務(wù)的方式就更進一步,如果有很多不同業(yè)務(wù)需要編排部署任務(wù),就會產(chǎn)生很多playbook的yml文件,不好維護。所以通過role組件定義了一些固定的目錄規(guī)范存放任務(wù)相關(guān)的文件,涉及到任務(wù)編排的yml語法和playbook類似,基本沒有變動。
各種插件
除了上述提到的組件外,Ansible還有很多插件來讓Ansible額外完成某些功能,比如日志,郵件功能,另外,Ansible默認的連接主機的方式是ssh,可以通過連接插件來來支持其他的連接方式。
至此,大致介紹了完了Ansible的組成架構(gòu),接著我們詳細看下Ansible編排任務(wù)的語法是怎么樣的,了解了語法后,便可以自己編寫Ansible的任務(wù)了。
語法介紹
Ad-hoc臨時命令模式
雖然我是極力建議使用Ansible編寫對線上服務(wù)的部署任務(wù)時,盡量采用playbook方式,這樣能文檔化任務(wù)。但是一些簡單的命令又想批量的在主機上運行,還是可以用到Ad-hoc方式執(zhí)行。
我們簡單的看看其使用規(guī)則,-m 參數(shù) 指定使用的模塊,-a 參數(shù)指定模塊使用到的命令。舉幾個簡單的例子,
使用了shell模塊,輸出test機器組中每個linux服務(wù)器的主機名
(base) ?  boxdev ansible  -i hosts test -m shell -a 'hostname'  
159.138.99.123 | CHANGED | rc=0 >>
hw-sg1-test-0001
使用了copy模塊將本地的ReadMe.md 文件復(fù)制到了遠程
(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 的使用十分簡單,關(guān)鍵都是要掌握Ansible中有哪些模塊,各個模塊能有哪些參數(shù),具體參考文檔 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin
playbook編排模式
接下來,來看下playbook使用yml編排任務(wù)時的語法規(guī)則。如下是一個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的基礎(chǔ)語法了首先hosts代表使用到的機器組,all代表主機清單上全部的機器組。
tasks下面定義的是Ansible需要執(zhí)行的任務(wù),name代表人物的名稱,接著就是Ansible的一些模塊,像上面例子中就用到了yum模塊,template模塊。模塊的用法以及需要定義哪些參數(shù)和使用Ad-hoc命令時一致。
在任務(wù)后面還可以跟notify 配置,它代表在該任務(wù)完成后可以執(zhí)行的額外操作,操作定義在handlers里,如上面例子那樣,在Copy Nginx.conf任務(wù)完成后,執(zhí)行了ReStart Nginx Service的handler,這個handler被定義在下面handlers的配置里,也是引用Ansible的模塊的方式,使用了service模塊啟動nginx服務(wù)。
總結(jié)
你可以發(fā)現(xiàn),其實用上Ansible并不難,關(guān)鍵就是熟練的掌握各種模塊的用法,無她,唯手熟爾。關(guān)于playbook的語法還涉及到參數(shù)定義,role模式的寫法,這些詳細的語法會放到后面的章節(jié)在繼續(xù)講解,這一節(jié)先簡單的知道Ansible是個什么東西,能看懂很簡單的playbook配置文件即可。
總結(jié)
以上是生活随笔為你收集整理的Ansible自动化部署工具-组件及语法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JUC并发编程学习笔记(十七)彻底玩转单
- 下一篇: Nomad 推出车用 MagSafe 配
