吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Ansible到底是個什么東西?

8nfr_ZTEdevelop ? 來源:未知 ? 作者:李倩 ? 2018-04-08 14:47 ? 次閱讀

前言

最近在重構一款命令行工具,使用 golang 重新開發,但需要繼續維持原有的命令,同時增加新命令。

在重構的過程中,需要對現命令行工具和原命令行工具的命令輸出結果進行比對,確保完全一致(項目要求),命令行工具需要在部署完成系統之后進行使用,每個系統完成時的部署組件又稍微有點差異。所以其實需要在多套服務主機上進行測試。

需要做這些動作:

拷貝一些配置文件到主機上:用戶配置、IP和端口文件

安裝命令行工具,確保使其在服務主機上可以使用

執行一堆測試命令

按理說,我不斷把需要的配置和二進制文件拷貝到主機上進行測試也能完成。

但在使用的過程中存在下面幾個問題:

測試發現,結果不對時需要及時修改代碼,再次拷貝二進制文件到主機上

主機環境需要多次推倒,重新部署,驗證版本更新問題

需要手動一個一個命令的執行

測試有幾套主機

看上去手動的方法,有點費勁。

目前我從事的工作就是PaaS部署相關的,部署層面的腳本的運行、組件的安裝、服務的啟動等都是使用 Ansible 來操作。具體的腳本編寫由其他同事,我只知道這個東西是干嘛的。沒實質性的學習。于是想借這個機會主動學習下 Ansible.

學習之處,差點犯了老問題,即:從頭開始看官方文檔,而不注重當前需要解決的問題。

因為其實整個 Ansible 的內容體系很多。不注重當前需要解決的問題,會導致你抓不住重點。

意識到后專注在當前需要解決的問題上:

拷貝配置文件和安裝腳本到多個主機上

在多個主機上測試命令行工具

Ansible

看了上面的事件背景,你大概知道這個 Ansible 到底是個什么東西。

Ansible 是一個配置管理和應用部署工具,即在管理主機上操作一些命令就能在節點主機上進行相應的動作。由 Python 編寫,由模塊化組成,即執行動作的實體,在 ansible 上都是靠著相應的模塊執行動作,比如拷貝 copy 模塊、執行 command 模塊、shell 模塊、文件 file 模塊等。

Ansible 的目標有如下:

自動化部署應用

自動化管理配置

自動化的持續交付

自動化的(AWS)云服務管理。

原理

管理主機從 hosts 里讀取主機清單,通過 playbook 按順序同時對管理的主機進行相應的操作。

如圖:

管理主機主要是對主機的定義和配置、編寫 playbook(即節點主機的執行動作)。

運行:

1. 命令行

ansible all -m ping

2. playbook

ansible-playbook example.yml

主機清單

編輯文件:/etc/ansible/hosts

即:定義主機名稱,變量等

主機的變量包括什么: 主機的執行用戶、連接端口、密碼等

類似于 ini 格式的文件

[test-new-cli] 10.62.60.72 [test-old-cli] 10.62.62.88

上面的例子:將兩個主機的分為兩組:test-new-cli和test-old-cli

主機的變量有這么些:

ansible_ssh_host將要連接的遠程主機名.與你想要設定的主機的別名不同的話,可通過此變量設置.

ansible_ssh_portssh端口號.如果不是默認的端口號,通過此變量設置.

ansible_ssh_user默認的 ssh 用戶名

ansible_ssh_passssh 密碼(這種方式并不安全,我們強烈建議使用 —ask-pass 或 SSH 密鑰)

ansible_sudo_passsudo 密碼(這種方式并不安全,我們強烈建議使用 —ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)sudo 命令路徑(適用于1.8及以上版本)

ansible_connection與主機的連接類型.比如:local, ssh 或者 paramiko.

ansible_ssh_private_key_filessh 使用的私鑰文件.適用于有多個密鑰,而你不想使用 SSH 代理的情況.

ansible_shell_type目標系統的shell類型.默認情況下,命令的執行使用 ‘sh’ 語法,可設置為 ‘csh’ 或 ‘fish’.

ansible_python_interpreter目標主機的 python 路徑.

看不懂怎么用:

舉個例子,你想連接主機192.168.100.100, 切換到 root 用戶下執行相應的操作。

如果你直接sshusername@192.168.100.100會要求你輸入用戶名和密碼。

假如我編輯主機清單使得自己不需要輸入用戶名密碼,怎么操作?

[test-new-cli] example ansible_ssh_host=192.168.100.100 ansible_ssh_user=username ansible_ssh_pass=root

即配置好192.168.100.100的主機別名為example, 主機的用戶名和密碼為:username/root

Yaml

包含三種類型:

鍵值對:key: value

數組

純量:整型、字符串、布爾型

這個很好理解:如果你熟悉Python, 這三種類型就相當于:map, list, 變量

如果你熟悉golang, 這三種類型就相當于: map, 數組, 變量

示例:

--- - 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 命令行式,適合執行單條命令。

# 操作 192.168.100.100 主機,看管理主機是否和192.168.100.100的主機連通 ansible example -m ping # 操作 192.168.100.100 主機,拷貝管理主機下的/root/opcli/conf 文件至節點主機/etc/opcli/conf 下 ansible test-new-cli -m copy -a="src=/root/opcli/conf dest=/etc/opcli/conf"

m: 模塊

a: 接參數

可以看出適合執行單條命令

Patterns

假如你的節點主機分組很多了,Ad-hoc 如何選擇特定特征的節點主機分組呢?

使用類正則表達式。

比如觸發所有節點主機進行動作:

ansible all -m ping ansible * -m ping 兩者等價,都是選擇所有的節點主機

示例:

1. 主機別名或者IP

one.example.com one.example.com:two.example.com 192.168.1.50 192.168.1.*

2. 一個或多個groups

webservers webservers:dbservers

3. 排除一個組

webservers:!phoenix # 隸屬 webservers 組但同時不在 phoenix組

4. 兩個組的交集

webservers:&staging # 同時隸屬于 webservers 和 staging 組

5. 列表

webservers[0] webservers[0-25]

6. 其他

有什么需求,看官方文檔吧。

Playbook

編寫 yaml 文件,適合執行多步操作的復雜操作。可以看成是Ad-doc 命令的集合。甚至可以看成是一門編程語言。

執行:ansible-playbook example.yml

按照 example.yml 文件里的任務集合按步執行任務。

示例

命令示例,僅舉幾例,有帶參數、有沒帶參數的。

我們最終的目標是:在節點主機上執行這些命令進行比對兩者結果。

新版本:

命令 說明
command-cli nodepool list 查詢資源池
command-cli nodepool node list 查詢資源池節點
command-cli node list 查詢節點
command-cli node show 查詢某個節點
command-cli task list 查詢部署任務

舊版本:

命令 說明
old-cli nodepool list 查詢資源池
old-cli nodepool node list 查詢資源池節點
old-cli node list 查詢節點
old-cli node show 查詢某個節點
old-cli task list 查詢部署任務

目錄結構:

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

第一步:編寫主機清單

/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

定義主機連接類型、用戶名、密碼

第二步:編寫 yaml 文件

主要動作:

在節點主機上創建兩個文件夾:/etc/client/conf和/et/client/commands

拷貝管理主機目錄:/etc/client/conf文件至節點主機:/etc/client/conf

拷貝管理主機二進制文件:/root/gosrc/src/client/command-cli至節點主機/etc/client/commands

軟連接節點主機二進制文件:/etc/client/commands/command-cli至節點主機/usr/bin/command-cli

執行上表中查詢命令:nodepool, node, task

main.yml

--- - hosts: test_client remote_user: root become: yes become_user: root become_method: sudo tasks: # 在節點主機上創建目錄:/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" # 拷貝管理主機配置文件/etc/client/conf和二進制文件至 /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 - include_tasks: "nodepool/nodepool-node-list.yml" with_items: - { id: "1", client: "new client", name: "command-cli"} - { id: "1", client: "old client", name: "old-cli"} # node list - include_tasks: "node/node-list.yml" with_items: - { client: "new client", name: "command-cli"} - { client: "old client", name: "old-cli"} # node show - include_tasks: "node/node-show.yml" with_items: - { client: "new client", name: "command-cli", id: 1} - { client: "old client", name: "old-cli", id: 1} # task list - include_tasks: "task/task-list.yml" with_items: - { client: "new client", name: "command-cli"} - { client: "old client", name: "old-cli"}

task-list.yml

--- - name: execute command task list shell: "{ {item.name} } task list" register: result - name: show result debug: msg: "{ {result.stdout_lines} }"

第三步: 檢查語法

兩種方法

ansible-playbook main.yml --syntax-check

先安裝pip install ansible-lint

ansible-lint main.yml

第四步: 執行

ansible-playbook main.yml

整個的編寫流程大概是這樣。核心是編寫 yml 文件,調用 ansible 支持的各種模塊完成任務。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 主機
    +關注

    關注

    0

    文章

    1010

    瀏覽量

    35307
  • PaaS
    +關注

    關注

    2

    文章

    132

    瀏覽量

    21518

原文標題:干貨 | Ansible 上手指南

文章出處:【微信號:ZTEdeveloper,微信公眾號:中興開發者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ucos3移植的兩錯誤信息到底是什么?

    INT_SYS_DisableIRQGlobal (referred from cpu_c.o). 另外一是INT_SYS_EnableIRQGlobal。這兩到底是什么東西,怎
    發表于 08-11 21:47

    請教技術大佬 三態門與高阻態是撒子東西

    新人在工作中經常碰到三態門與高阻態;請教技術大佬,這兩到底是什么東西
    發表于 04-07 06:59

    在ahdllib中opamp的veriloga代碼中,cout是什么東西

    electrical,到底是什么東西?輸出電容嗎?如果是的話怎么和vref聯系起來呢?多謝,多謝! 備注:vref 為1/2*vdd我是初學veriloga.能把該運放的小信號圖給我畫一下嗎?這是一級運放吧
    發表于 06-24 06:59

    手機參數中的4+64G到底是什么東西

    了解手機中的4+64G到底是什么東西!!
    發表于 09-14 09:07

    ARM是什么東西

    ARM是什么東西? ARM ( Advanced RISC Machines ),既可以認為是一公司的名字,也可以
    發表于 03-30 13:42 ?2106次閱讀

    LiFePO4是什么東西?

    LiFePO4是什么東西?  LiFePO4是自行車專用電池
    發表于 10-27 10:31 ?2839次閱讀

    全液晶儀表到底是什么東西

    當談到汽車虛擬座艙時,就繞不過去兩關鍵詞:智能和大屏。而隨著車內信息量爆增,人們對車輛科技感的要求也在不自覺地提高。 其中,液晶顯示技術可以說在最近十年逐漸成為了市場中的主流,而在車內有這樣一塊看起來頗具逼格的大屏幕,載人的時候貌似也能多幾份面子。那全液晶儀表到底是什么
    發表于 04-23 11:26 ?1.1w次閱讀

    CPU釬焊工藝到底是什么

    9代酷睿處理器已經發布了不少型號了,雖然Core i7-9700K加了2核心但是卻刪了超線程。而最吸引人的點卻是傳說中的“釬焊工藝”,今天我們來簡單聊聊這個“釬焊”到底是什么東西
    發表于 10-23 11:09 ?4w次閱讀

    工業觸摸屏到底是什么東西

    對于觸摸屏,我們大家都經常看見,比如我們現在的手機屏幕,就是一觸摸屏,銀行的叫號機器,也是一觸摸屏,那么工業觸摸屏又是什么東西呢?
    發表于 05-24 10:30 ?6167次閱讀

    元宇宙到底是什么東西

     2021年元宇宙大火,也成為了人們的投資的一風口,也有人把2021年看做是元宇宙的元年。那么元宇宙到底是什么?
    的頭像 發表于 11-02 15:54 ?5388次閱讀

    芯片到底是什么東西

    全球芯片短缺愈演愈烈,多家車企瀕臨停產,芯片已經成為我們不可或缺的物件,在日常生活中有著非常廣泛的應用,越來越多的高科技產品都在使用芯片,那么芯片到底是什么東西?
    的頭像 發表于 01-04 11:56 ?2w次閱讀

    集成電路到底是什么東西

    在我們的生活中,許多設備里都會出現集成電路,或許有的小伙伴很困惑集成電路到底是什么東西,那么下面我們一起來了解一下吧。 集成電路是一種微型電子器件或部件,縮寫為IC,就是把一定數量的常用電子元件通過
    的頭像 發表于 02-01 10:40 ?1w次閱讀

    Armv8-A到底是什么東西呢?

    前面的文章中經常提到Armv8-A。那么到底Armv8-A是什么東西呢?這個問題要說簡單也很簡單,要說復雜也很復雜。今天我們花點時間來簡單研究一下。
    的頭像 發表于 04-19 14:32 ?5058次閱讀
    Armv8-A<b class='flag-5'>到底是</b><b class='flag-5'>什么東西</b>呢?

    脈寬調制到底是什么東西

    昨天在結尾處提到了PAM、PWM和SPWM,說它們經常會在一些說明書或參考書中見到,尤其是在變頻器的說明書當中,那么,它們到底是什么東西哪?今天就說道說道這個事。
    的頭像 發表于 08-30 15:59 ?1600次閱讀
    脈寬調制<b class='flag-5'>到底是</b><b class='flag-5'>個</b><b class='flag-5'>什么東西</b>?

    硬件測試是測試什么東西

    某一型號或者某一批次的產品質量存在問題,產品設計不合理而導致大量召回的新聞。 所以硬件測試是對于產品研發過程中的重要把關,保證最終產品上市是一相對完美的狀態。 那這個硬件測試到底是測試什么
    的頭像 發表于 11-06 10:45 ?2737次閱讀
    民和| 砚山县| 百家乐稳定打法| 五常市| 女优百家乐的玩法技巧和规则| 巨星百家乐官网的玩法技巧和规则| 百家乐官网投注杀手| 网络百家乐| 皇冠网小说推荐| 威尼斯人娱乐场门票| 新利百家乐的玩法技巧和规则 | 百家乐天下第一缆| 百家乐官网如何盈利| 百家乐官网开和几率| 网络百家乐官网可靠吗| 太阳城77娱乐城| 大发888游戏平台 df888ylc3403 | 澳门百家乐真人娱乐城| 百家乐官网游戏| 百家乐透视用设备| 百家乐三珠连跳打法| 乐百家乐彩娱乐城| 百家乐看炉子的方法| 百家乐有电脑游戏吗| 百家乐龙虎| 最可信百家乐娱乐城| 威尼斯人娱乐城 老品牌值得您信赖| 玩百家乐请高手指点| 威尼斯人娱乐城信誉| 大发888客户端 运行| 大发888下载并安装| 三晋棋牌中心| 鹤庆县| 八大胜备用网址| 安陆市| 金木棉赌场| 博彩太阳城| 伟易博百家乐官网现金网| 澳门顶级赌场手机版| 乌鲁木齐县| 赌场百家乐官网代理|