1. 程式人生 > >java分散式系統部署學習(五)ansible Dynamic Inventory

java分散式系統部署學習(五)ansible Dynamic Inventory

Ansible Inventory實際上是包含靜態Inventory和動態Inventory兩部分,靜態Inventory指的是在檔案/etc/ansible/hosts中指定的主機和組,Dynamic Inventory指通過外部指令碼獲取主機列表,並按照ansible 所要求的格式返回給ansilbe命令的。這部分一般會結合CMDB資管系統、zabbix 監控系統、crobble安裝系統、雲端計算平臺等獲取主機資訊。由於主機資源一般會動態的進行增減,而這些系統一般會智慧更新。我們可以通過這些工具提供的API 或者接入庫查詢等方式返回主機列表。

一、最簡單示例

由於Ansible在接受指令碼動態獲取主機資訊時支援的是json格式,這裡我也不從其他系統中取了,向通過一段程式碼列印一個段json格式的主機資訊:

#!/usr/bin/env python
# coding=utf-8
import json
host1ip = ['10.212.52.252','10.212.52.14']
host2ip = ['10.212.52.16']
group = 'test1'
group2 = 'test2'
hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}}
print json.dumps(hostdata,indent=4)

注:
1、主機部分必須是列表格式的;
2、hostdata行,其中的”hosts” 部分可以省略,但如果使用時,必須是”hosts” ,不能是其他如‘‘hostlist’’ 等字串。

省略後可以這樣寫:

hostdata = {group:host1ip,group2:host2ip} 

直接執行該段程式碼結果如下:

# python twogroup.py
{
    "test1": {
        "hosts": [
            "10.212.52.252",
            "10.212.52.14"
        ]
    },
    "test2": {
        "hosts": [
            "10.212.52.16"
        ]
    }
}

上面定義了兩個主機組,test1組內包含主機10.212.52.252、10.212.52.14,test2組內包含主機10.212.52.16 。ansible可以通過如下方法呼叫:

[root@361way.com ~]# ansible -i twogroup.py test1 -m command -a 'uptime' -k
SSH password:
10.212.52.252 | success | rc=0 >>
 23:01pm  up 24 days  8:24,  2 users,  load average: 0.21, 0.35, 0.39
10.212.52.14 | success | rc=0 >>
 23:08pm  up 332 days  5:23,  2 users,  load average: 0.00, 0.01, 0.05
[root@361way.com ~]# ansible -i twogroup.py test2 -m command -a 'uptime' -k
SSH password:
10.212.52.16 | success | rc=0 >>
 23:09pm  up 332 days  6:00,  2 users,  load average: 0.08, 0.06, 0.05

二、複雜示例

在靜態主機配置檔案示例中,會有組變數(vars),組之間的包含,如下圖:
這裡寫圖片描述
如果以上部分想要,通過指令碼獲取實現,實現後返回的json格式應該如下圖:
這裡寫圖片描述
像上面這種複雜的返回格式,一般不會用在ad-hoc環境中,多數會用在ansible-playbook 中,應為playbook檔案中有時假會涉及到vars 引數的傳參。

三、從第三方平臺獲取主機示例

這個在本篇一開頭就提到了,我們從如cobbler、cmdb等平臺上獲取的示例。由於ansible 的發起者(作者)同時又是cobbler軟體的建立者,所以官方文件給了我們cobbler的示例,同時給出了一個從AWS 去上獲取主機資訊的示例 。如下:
cobbler示例程式碼
AWS EC2示例
關於如何從aws上獲取主機資訊併入庫,這個我之前也寫過相關的篇章,具體也可以參看我之前的博文----AWS主機資產管理 (該篇也是純python實現的)。
通過zabbix api 獲取主機資訊,我也寫過一篇zabbix小結(八)Zabbix api ,想要通過zabbix平臺上獲取主機列表資訊也可以參考下。

四、其他

1、ansible -i 引數後呼叫的指令碼並非一定是py檔案,也可以是其他指令碼輸出的結果,這裡做了個簡單的測試:

# ansible -i group.sh test1 -m command -a 'uptime' -k
SSH password:
10.212.52.16 | success | rc=0 >>
 00:18am  up 332 days  7:10,  2 users,  load average: 0.00, 0.01, 0.05
10.212.52.14 | success | rc=0 >>
 00:17am  up 332 days  6:32,  2 users,  load average: 0.01, 0.03, 0.05
10.212.52.252 | success | rc=0 >>
 00:11am  up 24 days  9:33,  2 users,  load average: 0.49, 0.42, 0.41
# cat group.sh
#!/bin/bash
groups='''
{
    "test1": {
        "hosts": [
            "10.212.52.252",
            "10.212.52.14",
            "10.212.52.16"
        ]
    }
}
'''
echo $groups

2、-i 引數指定的指令碼需要有可執行許可權 ,不然會報錯,如下:

# ansible -i hostjson.py  AA  -a 'uptime'
ERROR: The file hostjson.py looks like it should be an executable inventory script, but is not marked executable. Perhaps you want to correct this with `chmod +x hostjson.py`?

相關推薦

java分散式系統部署學習ansible Dynamic Inventory

Ansible Inventory實際上是包含靜態Inventory和動態Inventory兩部分,靜態Inventory指的是在檔案/etc/ansible/hosts中指定的主機和組,Dynamic Inventory指通過外部指令碼獲取主機列表,並按照an

java分散式系統部署學習ansibleInventory與Patterns

Ansible的Inventory檔案,可以理解為saltstack中的salt-key中的所有minion的列表以及使用者自定義的nodegroup的概念,預設情況下這個檔案是/etc/ansible/hosts ,後面還會講到Dynamic Inventor

java分散式系統部署學習ansible-playbook進階

一、併發執行 ansible預設只會建立5個程序,所以一次任務只能同時控制5臺機器執行.那如果你有大量的機器需要控制,或者你希望減少程序數,那你可以採取非同步執行.ansible的模組可以把task放進後臺,然後輪詢它.這使得在一定程序數下能讓大量需要的機器同時運作起來. 使用asy

java分散式系統部署學習ansible Ad-hoc與commands模組

Ad-Hoc 是指ansible下臨時執行的一條命令,並且不需要儲存的命令,對於複雜的命令後面會說playbook。講到Ad-hoc 就要提到模組,所有的命令執行都要依賴於事先寫好的模組,預設安裝好的ansible 裡面已經自帶了很多模組,如:command、r

java分散式系統部署學習ansible配置ansible.cfg

Ansible預設安裝好後有一個配置檔案/etc/ansible/ansible.cfg,該配置檔案中定義了ansible的主機的預設配置部分,如預設是否需要輸入密碼、是否開啟sudo認證、action_plugins外掛的位置、hosts主機組的位置、是否開啟

java分散式系統部署學習(二)ansible構架

一、Ansible基本架構 ansible是一個模型驅動的配置管理器,支援多節點發布、遠端任務執行。預設使用 SSH 進行遠端連線。無需在被管理節點上安裝附加軟體,可使用各種程式語言進行擴充套件。 上圖為ansible的基本架構,從上圖可以瞭解到其由以下

JAVA學習

java學習 步驟 字符串 關系運算符 幫助 條件判斷 方式 -- lean 一、 調試 步驟1:設置斷點(不能在空白處設置斷點) 步驟2:啟動調試 步驟3:調試代碼(F6單步跳過)筆記本Fn+F6(F5) 步驟4:結束調試 掌握調試的好處? 很清晰的看到,

java學習java類繼承

author java學習 dex int demo [] color javac print 1.制作一個工具類的文檔 javadoc -d 目錄 -author -version arrayTool.java 實例: class arrayDemo {

java學習--- 方法

ret img 技術分享 註意 不能 logs 必須 方法 類型 方法的定義 修飾符 返回值類型 方法名(參數類型 參數名){ ... 方法體 ... return 返回值; } 註意:非void方法必須有返回值 方法重載:   可以聲

java虛擬機學習--垃圾收集器總結

9.png 階段 大對象 技術 增加 系統 current 提前 及其 JVM——垃圾收集器總結 一、垃圾收集器概覽   收集算法是內存回收的方法論,垃圾收集據是內存回收的具體實現。Java虛擬機規範中對垃圾收集器應該如何實現沒有規定,不同的廠商、不同版本的虛擬機所提供的垃

linux菜鳥基礎學習 系統日誌

unix 18C 關閉 系統 0.11 cron rate 保存 日誌類 系統日誌 1.系統日誌默認分類 /var/log/messages ##系統服務及日誌,包括服務的信息,報錯等等/var/log/secure ##系統認證信息日誌/var/log/mai

Elasticsearch學習分散式特性

Elasticsearch 儘可能地遮蔽了分散式系統的複雜性。這裡列舉了一些在後臺自動執行的操作 分配文件到不同的容器 或 分片 中,文件可以儲存在一個或多個節點中 按叢集節點來均衡分配這些分片,從而對索引和搜尋過程進行負載均衡 複製每個分片以支援資

Linux學習——系統資訊相關命令

系統資訊相關命令 本節內容主要是為了方便通過遠端終端維護伺服器時,檢視伺服器上當前 系統日期和時間 / 磁碟空間佔用情況 / 程式執行情況 本小結學習的終端命令基本都是查詢命令,通過這些命令對系統資源的使用情況有個瞭解 目標 時間和日期 date

Java圖書管理系統練習程式

Java圖書管理系統練習程式(五) 本部分內容,主要實現對檔案讀寫操作的修改,使用泛型類的方式,實現對不同檔案進行相同的讀寫操作。 一.建立書籍資訊類 1.首先在bean包中,建立Book類,描述書籍的相關資訊,程式碼如下: package sky.book.bean; imp

Java學習判斷使用者輸入屬於哪個季節

package com.linfeng.debug; import java.util.Scanner; public class JudeMonth { public static void main(String[] args) { Scann

Java 學習—— 執行緒

一、執行緒的基本概念         1.執行緒是一個程式內部的順序控制流。     2.執行緒和程序的區別          ① 每個程序都

系統學習深度學習 --遞迴神經網路原理,實現及應用

      但是大神們說,標準的RNN在實際使用中效果不是很好,真正起到作用的是LSTM,因此RNN只做簡單學習,不上原始碼(轉載了兩篇,第一個是簡單推導,第二個是應用介紹)。 下面是簡單推導,轉自:http://blog.csdn.net/aws3217150/article/details/5076

分散式服務架構學習:實現自己的RPC框架採用Java Socket

RPC實現原理圖: 1、Service API對應服務介面。 HelloService.java程式碼如下: package com.shan.rpc.service; public interface HelloService { public String

mybatis系統學習——mybatis原始碼之內部基本處理流程

mybatis使用中的模組互動 在之前的學習中我們知道了,一個簡單的基礎mybatis專案基本會包含如下幾個必要的部分: 從上圖中可以清晰的看到,整個資料的走向最終是指向了業務類,也就是說無論是配置還是介面,還是依賴包,最終的作用都是為了業務,為了解決實

cmake學習 系統預設變數和內建變數

1、在不同的平臺編譯的時候,會用到一些系統內建的變數,比如作業系統名稱,版本號之類: CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22","FreeBSD-5.4-RELEASE" 或 "Windows 5.1" CMAKE_SYSTEM_NAME:系統名