[toc] # Infoblox WAPI 文件 在瀏覽器網址列中輸入 **https://<grid_master>/wapidoc/** 可以線上閱覽 WAPI 相關說明文件。  :::info 連線至 Grid Master 取得線上文件,這裡提供詳細的 API 使用說明。 ::: # 配置 Postman Postman 是一個可以讓我們測試 HTTP 請求的工具,可以輕鬆地透過圖形介面完成 API 連接測試。目前 **Postman API 平台**有提供**桌面安裝版(App)**和**雲端版(Web)**。 <img width=180 src='https://hackmd.io/_uploads/HkntXz8qn.png'> ## 安裝 Postman 請根據需求閱讀以下 Postman 官方資訊,自行下載並安裝 Postman。 - [Download Postman](https://www.postman.com/downloads/) - [Installing and updating Postman](https://learning.postman.com/docs/getting-started/installation-and-updates/) :::info - 若是使用 Linux 系統,之前隨便寫了一個安裝更新 Postman 的腳本檔,放在附錄以供參考[[**連結**]](#Postman-安裝腳本範例)。 - 記得註冊一組免費的 Postman 帳號,可以跨裝置同步資料 [[**註冊帳號**]](https://identity.getpostman.com/signup)。 - [使用 Postman 探索 VMware API - Part 1](https://hackmd.io/@farmer87/postman_vsphere_01) ::: **執行畫面**  ## 匯入套件 接著根據 Infoblox 部落格 [[**Getting started with WAPIs using POSTMAN**]](https://blogs.infoblox.com/community/getting-started-with-wapis-using-postman/) 完成 Postman 環境配置。 下載 WAPI Postman Zip 檔案 [[**連結**]](https://blogs.infoblox.com/wp-content/uploads/WAPI-POSTMAN-Files.zip),解壓後其中包含 2 個檔案: - `Infoblox WAPI Postman Collection.postman_collection.json`: WAPI call 範例精選集(collection)。 - `Infoblox WAPI environment variables.postman_environment.json`: 定義的環境變數(environment variables)。 點擊 **Import** 並選擇上述 2 個檔案進行匯入。  成功匯入後,點擊左側 **Collections**,顯示相關內容。  點擊左側 **Environments**,顯示相關內容。  ## 環境配置 接著跟著以下步驟完成環境設定。 ### 調整環境變數 點擊 **Environments** > **Infoblox WAPI Enviornment Variables**,在 **grid_master** 變數的 **Initial value(初始值)** 欄位輸入佈署的 Grid Master IP 位址資訊。 滑鼠移至 **Current value** 欄位右側,出現 **`···`** 選擇 **Reset**,將會把 **Initial value** 填入 **Current value**。  完成後記得點擊上方 **Save** 儲存。記得之後只要有作過相關變動就要按下 **Save** 儲存,否則 Postman 不會讀取變更後的參數值。  部落格要我們輸入 **Base64_encoding** 作為 HTTP 請求驗證使用。若是使用預設帳密,請將 **`admin:infoblox`** 用 [**base64**](https://developer.mozilla.org/en-US/docs/Glossary/Base64) 轉換後填入在對應的初始值欄位。 :::info 若使用 Linux 平台,執行以下命令就可以取得! ```bash #!/bin/bash grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" auth_token=$(echo -ne "${login}" | base64 --wrap 0) echo -e "base64_encoding is [${auth_token}]" ``` ::: **有點麻煩對吧?!** 所以我們這裡**不採用這種方式**,反正這是採用 **Basic Authentication**,待會用 Postman 提供的功能就可以輕鬆達成。**這裡就先跳過**! ### 指定環境變數 點擊右上方 **No Environment** 右側,指定剛剛修改儲存的環境變數。  確認環境變數,後續 API 請求便會參考這裡的參數值執行。  ## 選擇驗證方式 對於每次 API 請求都會需要通過驗證,剛剛提到使用 base64_encoding 編碼有點不方便,這裡就直接使用 Postman 提供的驗證功能,輸入正確的連線帳密即可輕鬆完成驗證。 我們直接指定整個 Collections 的驗證方式,這樣一來下層的 API 請求都可依據相同的驗證方式執行。點擊左側 **Collections** > **Infoblox WAPI Postman Collection**,點擊中間區域上方的 **Authorization**,將原有 **Type: No Auth** 調整為 **Basic Auth**。  根據佈署環境輸入正確的登入帳密資訊,點選 **Save** 完成。  基本簡單設定先暫時到此。 # 執行 API 測試 接著選擇 API 請求範本來測試先前設定的**環境變數**及**驗證方式**是否可行? 這裡就選擇一個**取得 Grid Members 的 API 請求**執行測試。 > <font color=green>**GET**</font> https://<font color=orange>**{{grid_master}}**</font>/wapi/v2.7/member :::info 其中 **`{{grid_master}}`** 在 Postman 屬於 **{{變數}}**,用 **`{{ }}`** 標注起來,會依據不同方式取得。這裡是透過先前指定的環境變數取得參數值 **`{{grid_master}}=10.7.150.85`**。 ::: 點選 **Grid management scenarios** > **Members** > **GET Members**。 首先,先確認一下驗證類型為 **Inherit auth from parent(預設)**,這樣便會繼承上層 Collection 的驗證設定(Basic-Auth)。  其實可以點選 **Headers** 檢視一下執行 API 請求所帶入的標頭,Postman 會自動將驗證內容進行轉換,原有制定的 **Authorization: Basic {{`Base64_encoding`}}** 會被取代。  :::info 當然可以從這裡將 base64 轉換過的參數值填入環境變數 **`{{base64_encoding}}`** 使用。但是直接調整 **Postman 驗證類型**會是比較建議的方式。 ::: 一切就緒,只要點擊右上方的 **Send** 執行 API 請求即可。回應狀態為 **Status: 200 OK**,表示 API 請求執行正確。並以 **JSON 格式** 回傳回應值。  從結果可以得知目前這個 Grid 有 2 個成員,其中一個是 **gm.infoblox.localdomain**,另一個是 **rp.infoblox.localdomain**,兩個平台都是 **VNIOS**。 # 進階資訊 我們可以在環境變數中新增 2 個新變數以供使用。 | Variable | Type | Initial value | 說明 | | --- | --- | --- | --- | | api_version | default | v2.12.3 | API 版本 | | gm_password | secret | infoblox | 驗證密碼,使用 secret 類型可隱蔽內容 |  將原先明文的驗證密碼,輸入 `{{` 後會顯示可設定變數清單。  改用變數 **`{{gm_password}}`** 替代。  原先 API 版本號碼也用變數 **`{{api_version}}`** 替代,增加 API 請求執行彈性。  換另一個修改過的 API 請求 **檢視 Grid Members Service Status** 測試看看。結果似乎也是可以**得到正常的 API 請求回應**。 > <font color=green>**GET**</font> https://<font color=orange>**{{grid_master}}**</font>/wapi/<font color=orangr>{{api_version}}</font>/member?_return_fields%2B=service_status  可以參考官方文件,撰寫一個 API 請求 **檢視 Grid Members VIP Setting**。 > <font color=green>**GET**</font> https://<font color=orange>**{{grid_master}}**</font>/wapi/<font color=orange>**{{api_version}}**</font>/member?_return_fields%2B=<font color=red>**vip_setting**</font>  若是有程式撰寫需求,點擊右側 **</>** 符號,可顯示指定程式語言執行該 API 請求的代碼。  Postman 提供極為豐富的程式語言選擇進行轉換。 <img width=480 src='https://hackmd.io/_uploads/SJSMwUUq2.png'> :::success **結論** - 使用 Postman 可以很輕鬆地進行 API 功能測試。 - Infoblox WAPI 資訊有限,相關應用還有待確認。 - 將成員加入 Grid? - 啟用 NIOS 相關服務 DNS/DHCP/Reporting 等? - 配置 RPZ? ::: 使用以下的 API 可以將指定的成員移出 Grid 叢集。  測試就暫時到此吧,後續進階的應用,之後有時間測試再跟各位分享吧! :::info **Infoblox Client** 透過 WAPI 與 Infoblox NIOS 互動的終端用戶端軟體。 - [Infoblox@Github](https://github.com/infobloxopen/infoblox-client) - [Infoblox Client Documentation](https://infoblox-client.readthedocs.io/en/stable/readme.html) ::: # 參考 - [Why use Infoblox WAPIs?](https://community.infoblox.com/t5/best-practices/why-use-infoblox-wapis/ba-p/13262) - [Infoblox REST API - NIOS 8.6 Deployment Guide](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-infoblox-rest-api.pdf?utm_source=blox-community&utm_campaign=community-q2&utm_medium=blox-community) - [Getting started with WAPIs using POSTMAN](https://blogs.infoblox.com/community/getting-started-with-wapis-using-postman/) - [Postman VS Code extension](https://marketplace.visualstudio.com/items?itemName=Postman.postman-for-vscode) - Infoblox WAPI documentation - Examples accessing WAPI using Curl > https://<grid_master>/wapidoc/additional/sample.html - [使用 Postman 探索 VMware API - Part 1](https://hackmd.io/@farmer87/postman_vsphere_01) # 附錄 ## Postman 安裝腳本範例 **postmanUpdater.sh** 以下是使用 **Linux 作業系統**用來安裝及更新 Postman 的腳本程式範例,請根據系統環境需求進行修改。 :::info 其實更新就是移除舊版本,安裝新版本! ::: > **免責聲明** 請務必了解腳本內容,並修改至適合版本,若有造成系統故障,概不負責!:smile: ```bash #!/usr/bin/env bash # # edited by semigod function getInit () { if [ ! -f "${passport}" ]; then echo -e "<!> Passport is NOT FOUND!" exit else pass=$(cat ${passport}) fi if [ ! -d "${pmDownloadpath}" ]; then mkdir -p ${pmDownloadPath} fi } function getLatestVersion () { getVersionUrl='https://dl.pstmn.io/changelog?channel=stable&platform=linux' latestVersion=$(curl -s ${getVersionUrl} | jq -r '.changelog[0].name') } function getInstalled { local pmPkgJsonFile="${pmLocation}/app/resources/app/package.json" echo -e "\n[TASK] Checking if Postman is already installed (${pmLocation})" if [ -f "${pmPkgJsonFile}" ]; then installedStatus='true' pmInstalledVersion=$(cat ${pmPkgJsonFile} | jq -r '.version') echo -e " - Found Installed Postman (ver. ${pmInstalledVersion})" else installedStatus='false' #installededVersion="null" echo -e " - Did NOT Installed Postman" echo read -p ">> Do you want to install Postman RIGHT NOW (y/n)?" installAnswer if [ "${installAnswer}" == "y" ]; then getLatestVersion ## fullInstall ## pmInstalledVersion="${latestVersion}" elif [ "${installAnswer}" == "n" ]; then echo -e ">> Try Postman next time!\n" exit fi fi } function fullInstall () { downloadPostman installPostman configPostman } function downloadPostman () { latestVersionUrl="${pmDownloadBaseUrl}/${latestVersion}/linux${osArch}" pmTarball="${pmDownloadPath}/postman.tar.gz" echo -e "[TASK] Download Postman from [${latestVersionUrl}]" curl -o "${pmTarball}" "${latestVersionUrl}" } function installPostman () { if [ -f "${pmTarball}" ]; then echo -e "[TASK] Install Postman to ${pmLocation}" echo "${pass}" | sudo -S tar -C ${pmInstallPath} -xvzf ${pmTarball} installedStatus='true' else echo " <!> Fail to download ${pmTarball} and abort to install Postman\n" exit fi } function configPostman () { if [[ ! -f "/usr/bin/postman" || ! -f "${pmInstallPath}/Postman/Postman" ]]; then echo -e "\n[TASK] Create link to /usr/bin" echo ${pass} | sudo -S ln -s ${pmInstallPath}/Postman/Postman /usr/bin/postman fi local pmDesktopLocation="${HOME}/.local/share/applications" local pmDesktopShortcutFile="${pmDesktopLocation}/Postman.desktop" if [ ! -f "${pmDesktopShortcutFile}" ]; then echo -e "\n[TASK] Create Postman Application Icon" if [ ! -d ${pmDesktopLocation} ]; then mkdir -p ${pmDesktopLocation} fi echo "[Desktop Entry] Encoding=UTF-8 Name=Postman Exec=/opt/Postman/app/Postman %U Icon=/opt/Postman/app/resources/app/assets/icon.png Terminal=false Type=Application Categories=Development;" > ${pmDesktopShortcutFile} fi } function checkUpdate () { echo -e "\n[TASK] Check for updates" getLatestVersion if [ "${installedStatus}" == "true" ]; then if [ "${pmInstalledVersion}" != "${latestVersion}" ]; then echo -e " - Update Available" echo -e " Installed Version:\t ${pmInstalledVersion}" echo -e " Latest Version:\t ${latestVersion}" echo read -p ">> Do you want to upgrade to [${latestVersion}] RIGHT NOW (y/n)?" updateAnswer if [ "${updateAnswer}" == "y" ]; then updatePostman elif [ "${updateAnswer}" == "n" ]; then echo -e ">> Update Postman next time!\n" exit fi else echo -e " - Latest Version [${latestVersion}] Installed" fi #else # echo -e " - No local installation of Postman found!"; fi } function updatePostman () { ## clean the current version of Postman echo ${pass} | sudo -S rm -rf ${pmInstallPath}/Postman ## install the lastest version of Postman fullInstall } pmInstallPath='/opt' pmLocation='/opt/Postman' pmVersion='latest' pmDownloadBaseUrl='https://dl.pstmn.io/download/version' pmDownloadPath="${HOME}/Downloads/Postman" osArch='64' passport="${HOME}/.passport" function main () { getInit getInstalled configPostman checkUpdate #getLatestVersion } main ``` ## API 簡易應用 透過 Postman 提供的程式碼,可以簡單地透過先前測試的 API 查詢 Infoblox Grid 資訊。 **showGridInfo.sh** ```bash #!/usr/bin/env bash # # edited by semigod function getApi () { api="${1}" curl -s -k -X GET -H "Authorization: Basic ${auth_token}" "${wapi_baseurl}/${api}" } grid_master_ip='10.7.150.85' grid_master_user='admin' grid_master_pass='infoblox' grid_member='10.7.150.88' grid_name='infoblox' grid_secret='test' login="${grid_master_user}:${grid_master_pass}" auth_token=$(echo -ne "${login}" | base64 --wrap 0) wapi_ver='v2.12.3' wapi_baseurl="https://${grid_master_ip}/wapi/${wapi_ver}" gridHost=($(getApi "member" | jq -r '.[].host_name')) count=${#gridHost[@]} # grid members echo -e "\n[TASK] Get Grid Members" for host in ${gridHost[@]}; do echo -e "\n> [${host}]" getApi "member?host_name=${host}" | jq -r '.[] | " - Platform: " + .platform' done # grid members vip settings echo -e "\n[TASK] Get Grid Members VIP Settings" for host in ${gridHost[@]}; do echo -e "\n> [${host}]" getApi "member?host_name=${host}&_return_fields%2B=vip_setting" | jq -r '.[].vip_setting | " - Address: " + .address, " - Netmask: " + .subnet_mask, " - Gateway: " + .gateway' done # grid members service status echo -e "\n[TASK] Get Grid Members Service Status" for host in ${gridHost[@]}; do echo -e "\n> [${host}]" getApi "member?host_name=${host}&_return_fields%2B=service_status" | jq -r '.[].service_status[] | " - " + .service + ": " + .status' done ``` **執行結果** ```bash $ ./showGridInfo.sh [TASK] Get Grid Members > [gm.infoblox.localdomain] - Platform: VNIOS > [rp.infoblox.localdomain] - Platform: VNIOS [TASK] Get Grid Members VIP Settings > [gm.infoblox.localdomain] - Address: 10.7.150.85 - Netmask: 255.255.255.0 - Gateway: 10.7.150.254 > [rp.infoblox.localdomain] - Address: 10.7.150.88 - Netmask: 255.255.255.0 - Gateway: 10.7.150.254 [TASK] Get Grid Members Service Status > [gm.infoblox.localdomain] - DHCP: INACTIVE - DNS: WORKING - DFP: INACTIVE - DOT_DOH: UNKNOWN - NTP: INACTIVE - TFTP: INACTIVE - HTTP_FILE_DIST: INACTIVE - FTP: INACTIVE - BLOXTOOLS: INACTIVE - CAPTIVE_PORTAL: INACTIVE - HSM: UNKNOWN - REPORTING: WORKING - IMC: INACTIVE - IMC_DCA_BWL: UNKNOWN - CLOUD_DNS_SYNC: INACTIVE > [rp.infoblox.localdomain] - DFP: INACTIVE - DOT_DOH: UNKNOWN - NTP: INACTIVE - TFTP: INACTIVE - HTTP_FILE_DIST: INACTIVE - FTP: INACTIVE - BLOXTOOLS: INACTIVE - HSM: UNKNOWN - REPORTING: WORKING - IMC: INACTIVE - IMC_DCA_BWL: UNKNOWN - CLOUD_DNS_SYNC: INACTIVE ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up