前言
最近在重構(gòu)一款命令行工具,使用 golang 重新開(kāi)發(fā),但需要繼續(xù)維持原有的命令,同時(shí)增加新命令。
在重構(gòu)的過(guò)程中,需要對(duì)現(xiàn)命令行工具和原命令行工具的命令輸出結(jié)果進(jìn)行比對(duì),確保完全一致(項(xiàng)目要求),命令行工具需要在部署完成系統(tǒng)之后進(jìn)行使用,每個(gè)系統(tǒng)完成時(shí)的部署組件又稍微有點(diǎn)差異。所以其實(shí)需要在多套服務(wù)主機(jī)上進(jìn)行測(cè)試。
需要做這些動(dòng)作:
拷貝一些配置文件到主機(jī)上:用戶(hù)配置、IP和端口文件
安裝命令行工具,確保使其在服務(wù)主機(jī)上可以使用
執(zhí)行一堆測(cè)試命令
按理說(shuō),我不斷把需要的配置和二進(jìn)制文件拷貝到主機(jī)上進(jìn)行測(cè)試也能完成。
但在使用的過(guò)程中存在下面幾個(gè)問(wèn)題:
測(cè)試發(fā)現(xiàn),結(jié)果不對(duì)時(shí)需要及時(shí)修改代碼,再次拷貝二進(jìn)制文件到主機(jī)上
主機(jī)環(huán)境需要多次推倒,重新部署,驗(yàn)證版本更新問(wèn)題
需要手動(dòng)一個(gè)一個(gè)命令的執(zhí)行
測(cè)試有幾套主機(jī)
看上去手動(dòng)的方法,有點(diǎn)費(fèi)勁。
目前我從事的工作就是PaaS部署相關(guān)的,部署層面的腳本的運(yùn)行、組件的安裝、服務(wù)的啟動(dòng)等都是使用 Ansible 來(lái)操作。具體的腳本編寫(xiě)由其他同事,我只知道這個(gè)東西是干嘛的。沒(méi)實(shí)質(zhì)性的學(xué)習(xí)。于是想借這個(gè)機(jī)會(huì)主動(dòng)學(xué)習(xí)下 Ansible.
學(xué)習(xí)之處,差點(diǎn)犯了老問(wèn)題,即:從頭開(kāi)始看官方文檔,而不注重當(dāng)前需要解決的問(wèn)題。
因?yàn)槠鋵?shí)整個(gè) Ansible 的內(nèi)容體系很多。不注重當(dāng)前需要解決的問(wèn)題,會(huì)導(dǎo)致你抓不住重點(diǎn)。
意識(shí)到后專(zhuān)注在當(dāng)前需要解決的問(wèn)題上:
拷貝配置文件和安裝腳本到多個(gè)主機(jī)上
在多個(gè)主機(jī)上測(cè)試命令行工具
Ansible
看了上面的事件背景,你大概知道這個(gè) Ansible 到底是個(gè)什么東西。
Ansible 是一個(gè)配置管理和應(yīng)用部署工具,即在管理主機(jī)上操作一些命令就能在節(jié)點(diǎn)主機(jī)上進(jìn)行相應(yīng)的動(dòng)作。由 Python 編寫(xiě),由模塊化組成,即執(zhí)行動(dòng)作的實(shí)體,在 ansible 上都是靠著相應(yīng)的模塊執(zhí)行動(dòng)作,比如拷貝 copy 模塊、執(zhí)行 command 模塊、shell 模塊、文件 file 模塊等。
Ansible 的目標(biāo)有如下:
自動(dòng)化部署應(yīng)用
自動(dòng)化管理配置
自動(dòng)化的持續(xù)交付
自動(dòng)化的(AWS)云服務(wù)管理。
原理
管理主機(jī)從 hosts 里讀取主機(jī)清單,通過(guò) playbook 按順序同時(shí)對(duì)管理的主機(jī)進(jìn)行相應(yīng)的操作。
如圖:
管理主機(jī)主要是對(duì)主機(jī)的定義和配置、編寫(xiě) playbook(即節(jié)點(diǎn)主機(jī)的執(zhí)行動(dòng)作)。
運(yùn)行:
1. 命令行
ansible all -m ping
2. playbook
ansible-playbook example.yml
主機(jī)清單
編輯文件:/etc/ansible/hosts
即:定義主機(jī)名稱(chēng),變量等
主機(jī)的變量包括什么: 主機(jī)的執(zhí)行用戶(hù)、連接端口、密碼等
類(lèi)似于 ini 格式的文件
[test-new-cli] 10.62.60.72 [test-old-cli] 10.62.62.88
上面的例子:將兩個(gè)主機(jī)的分為兩組:test-new-cli和test-old-cli
主機(jī)的變量有這么些:
ansible_ssh_host將要連接的遠(yuǎn)程主機(jī)名.與你想要設(shè)定的主機(jī)的別名不同的話,可通過(guò)此變量設(shè)置.
ansible_ssh_portssh端口號(hào).如果不是默認(rèn)的端口號(hào),通過(guò)此變量設(shè)置.
ansible_ssh_user默認(rèn)的 ssh 用戶(hù)名
ansible_ssh_passssh 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 —ask-pass 或 SSH 密鑰)
ansible_sudo_passsudo 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 —ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)sudo 命令路徑(適用于1.8及以上版本)
ansible_connection與主機(jī)的連接類(lèi)型.比如:local, ssh 或者 paramiko.
ansible_ssh_private_key_filessh 使用的私鑰文件.適用于有多個(gè)密鑰,而你不想使用 SSH 代理的情況.
ansible_shell_type目標(biāo)系統(tǒng)的shell類(lèi)型.默認(rèn)情況下,命令的執(zhí)行使用 ‘sh’ 語(yǔ)法,可設(shè)置為 ‘csh’ 或 ‘fish’.
ansible_python_interpreter目標(biāo)主機(jī)的 python 路徑.
看不懂怎么用:
舉個(gè)例子,你想連接主機(jī)192.168.100.100, 切換到 root 用戶(hù)下執(zhí)行相應(yīng)的操作。
如果你直接[email protected]會(huì)要求你輸入用戶(hù)名和密碼。
假如我編輯主機(jī)清單使得自己不需要輸入用戶(hù)名密碼,怎么操作?
[test-new-cli] example ansible_ssh_host=192.168.100.100 ansible_ssh_user=username ansible_ssh_pass=root
即配置好192.168.100.100的主機(jī)別名為example, 主機(jī)的用戶(hù)名和密碼為:username/root
Yaml
包含三種類(lèi)型:
鍵值對(duì):key: value
數(shù)組
純量:整型、字符串、布爾型
這個(gè)很好理解:如果你熟悉Python, 這三種類(lèi)型就相當(dāng)于:map, list, 變量
如果你熟悉golang, 這三種類(lèi)型就相當(dāng)于: map, 數(shù)組, 變量
示例:
--- - name: "execute command nodepool node list by { {item.name} }" shell: "{ {item.cli} } nodepool node list { {item.id} }" register: result - name: show result debug: msg: "{ {result.stdout_lines} }" with_items: - { name: "new-cli", cli: "new-cli", id: "1" } - { name: "old-cli", cli: "old-cli", id: "1" }
模塊
Ad-doc
ansible 命令行式,適合執(zhí)行單條命令。
# 操作 192.168.100.100 主機(jī),看管理主機(jī)是否和192.168.100.100的主機(jī)連通 ansible example -m ping # 操作 192.168.100.100 主機(jī),拷貝管理主機(jī)下的/root/opcli/conf 文件至節(jié)點(diǎn)主機(jī)/etc/opcli/conf 下 ansible test-new-cli -m copy -a="src=/root/opcli/conf dest=/etc/opcli/conf"
m: 模塊
a: 接參數(shù)
可以看出適合執(zhí)行單條命令
Patterns
假如你的節(jié)點(diǎn)主機(jī)分組很多了,Ad-hoc 如何選擇特定特征的節(jié)點(diǎn)主機(jī)分組呢?
使用類(lèi)正則表達(dá)式。
比如觸發(fā)所有節(jié)點(diǎn)主機(jī)進(jìn)行動(dòng)作:
ansible all -m ping ansible * -m ping 兩者等價(jià),都是選擇所有的節(jié)點(diǎn)主機(jī)
示例:
1. 主機(jī)別名或者IP
one.example.com one.example.com:two.example.com 192.168.1.50 192.168.1.*
2. 一個(gè)或多個(gè)groups
webservers webservers:dbservers
3. 排除一個(gè)組
webservers:!phoenix # 隸屬 webservers 組但同時(shí)不在 phoenix組
4. 兩個(gè)組的交集
webservers:&staging # 同時(shí)隸屬于 webservers 和 staging 組
5. 列表
webservers[0] webservers[0-25]
6. 其他
有什么需求,看官方文檔吧。
Playbook
編寫(xiě) yaml 文件,適合執(zhí)行多步操作的復(fù)雜操作。可以看成是Ad-doc 命令的集合。甚至可以看成是一門(mén)編程語(yǔ)言。
執(zhí)行:ansible-playbook example.yml
按照 example.yml 文件里的任務(wù)集合按步執(zhí)行任務(wù)。
示例
命令示例,僅舉幾例,有帶參數(shù)、有沒(méi)帶參數(shù)的。
我們最終的目標(biāo)是:在節(jié)點(diǎn)主機(jī)上執(zhí)行這些命令進(jìn)行比對(duì)兩者結(jié)果。
新版本:
命令 | 說(shuō)明 |
---|---|
command-cli nodepool list | 查詢(xún)資源池 |
command-cli nodepool node list | 查詢(xún)資源池節(jié)點(diǎn) |
command-cli node list | 查詢(xún)節(jié)點(diǎn) |
command-cli node show | 查詢(xún)某個(gè)節(jié)點(diǎn) |
command-cli task list | 查詢(xún)部署任務(wù) |
…
舊版本:
命令 | 說(shuō)明 |
---|---|
old-cli nodepool list | 查詢(xún)資源池 |
old-cli nodepool node list | 查詢(xún)資源池節(jié)點(diǎn) |
old-cli node list | 查詢(xún)節(jié)點(diǎn) |
old-cli node show | 查詢(xún)某個(gè)節(jié)點(diǎn) |
old-cli task list | 查詢(xún)部署任務(wù) |
…
目錄結(jié)構(gòu):
demo-for-ansible: ---nodepool/nodepool-list.yml ---nodepool/nodepool-node-list.yml ---node/node-list.yml ---node/node-show.yml ---task/task-list.yml ---main.yml
第一步:編寫(xiě)主機(jī)清單
/etc/ansible/hosts
[test_client] 192.168.100.100 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh 192.168.100.101 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh 192.168.100.102 ansible_ssh_user=xiewei ansible_ssh_pass=root ansible_connection=ssh
定義主機(jī)連接類(lèi)型、用戶(hù)名、密碼
第二步:編寫(xiě) yaml 文件
主要?jiǎng)幼鳎?/p>
在節(jié)點(diǎn)主機(jī)上創(chuàng)建兩個(gè)文件夾:/etc/client/conf和/et/client/commands
拷貝管理主機(jī)目錄:/etc/client/conf文件至節(jié)點(diǎn)主機(jī):/etc/client/conf
拷貝管理主機(jī)二進(jìn)制文件:/root/gosrc/src/client/command-cli至節(jié)點(diǎn)主機(jī)/etc/client/commands
軟連接節(jié)點(diǎn)主機(jī)二進(jìn)制文件:/etc/client/commands/command-cli至節(jié)點(diǎn)主機(jī)/usr/bin/command-cli
執(zhí)行上表中查詢(xún)命令:nodepool, node, task
main.yml
--- - hosts: test_client remote_user: root become: yes become_user: root become_method: sudo tasks: # 在節(jié)點(diǎn)主機(jī)上創(chuàng)建目錄:/etc/client/conf - name: create /etc/client/conf /etc/client/commands file: path: "/etc/client/{ {item} }" owner: root group: root mode: 0755 state: directory with_items: - "conf" - "commands" # 拷貝管理主機(jī)配置文件/etc/client/conf和二進(jìn)制文件至 /etc/client/conf, /etc/client/commands - name: copy /etc/client/conf copy: src="{ { item.src } }" dest="{ { item.dest } }" owner=root group=root mode=0644 with_items: - { src: "/etc/client/conf", dest: "/etc/client/conf" } - { src: "/root/gosrc/src/client/command-cli", dest: "/etc/client/commands"} # 軟連接到 /usr/bin/command-cli - name: link /etc/client/commands file: src="/etc/client/commands/command-cli" dest="/usr/bin/command-cli" state=link # nodePool list - include_tasks: "nodepool/nodepool-list.yml" with_items: - { client: "new client", name: "command-cli"} - { client: "old client", name: "old-cli"} # nodePool node list
task-list.yml
--- - name: execute command task list shell: "{ {item.name} } task list" register: result - name: show result debug: msg: "{ {result.stdout_lines} }"
第三步: 檢查語(yǔ)法
兩種方法
ansible-playbook main.yml --syntax-check
先安裝pip install ansible-lint
ansible-lint main.yml
第四步: 執(zhí)行
ansible-playbook main.yml
整個(gè)的編寫(xiě)流程大概是這樣。核心是編寫(xiě) yml 文件,調(diào)用 ansible 支持的各種模塊完成任務(wù)。
-
主機(jī)
+關(guān)注
關(guān)注
0文章
1033瀏覽量
35801 -
PaaS
+關(guān)注
關(guān)注
2文章
134瀏覽量
22143
原文標(biāo)題:干貨 | Ansible 上手指南
文章出處:【微信號(hào):ZTEdeveloper,微信公眾號(hào):中興開(kāi)發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
ucos3移植的兩個(gè)錯(cuò)誤信息到底是什么?
請(qǐng)教技術(shù)大佬 三態(tài)門(mén)與高阻態(tài)是個(gè)撒子東西?
在ahdllib中opamp的veriloga代碼中,cout是個(gè)什么東西?
ARM是什么東西?
全液晶儀表到底是什么東西?
CPU釬焊工藝到底是什么
工業(yè)觸摸屏到底是一個(gè)什么東西
元宇宙到底是什么東西
芯片到底是什么東西
集成電路到底是什么東西
Armv8-A到底是什么東西呢?

脈寬調(diào)制到底是個(gè)什么東西?

智能盒子到底是什么東西?昇騰310深度測(cè)評(píng):為何能成為行業(yè)新寵?

評(píng)論