ansible動態Inventory主機清單配置遇到的坑!

坑1 : 動態主機清單配置,需要按照ansible的要求的格式返回給ansible命令的

源代碼如下:

但是在ansible-playbook中使用動態主機配置文件的時候,發生了錯誤!!!

 

提示沒有匹配的主機信息

分析: 數據庫已配置好,python腳本也能輸出,問題在於輸出的結果不是ansible想要的格式作爲ansible的命令輸入,因此排查如下

下面看下我的動態inventory輸出的格式吧

[root@ansible fang]# python ansible_inventory.py --list

{

    "all": [

        "192.168.10.104"

    ]

}

[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104

{

    "ansible_ssh_host": "192.168.10.104",

    "ansible_ssh_user": "root",

    "hostname": "clone-node1"

}

在網上找的方法,雖然實現了—list  --host的輸出,但是格式不滿足ansible格式輸出的要求,ansible需求的格式有哪些呢,請看解決辦法中….

輸出結果:

這是出錯的信息,提示還是找不到主機的信息

[root@ansible fang]#

ansible-playbook -i ansible_inventory.py bb.yml運行出錯

 

解決方法:

先說個知識點(ansible所要求的格式):

動態 Inventory 指通過外部腳本獲取主機列表,並按照 ansible 所要求的格式返回給 ansilbe 命令的

因此,需要清楚ansible需要那種inventory的格式呢

  1. 必須輸出爲 JSON 格式
  2. 同時必須支持兩個參數:--list 和 --host <hostname>。
  3. --list:用於返回所有的主機組信息,每個組所包含的主機列表 hosts、所含子組列表 children、主機組變量列表 vars 都應該是字典形式的,_meta 用來存放主機變量。

正確的輸出格式是什麼樣子的呢,請看下面:

以下的是正確的動態inventory的輸出格式,其中就是ansible的第三點要求 每個組所包含的主機列表 hosts、所含子組列表 children、主機組變量列表 vars 都應該是字典形式的,_meta 用來存放主機變量。

[root@ansible fang]# vim tt.py

[root@ansible fang]# python tt.py

{

    "group1": {

        "hosts": [

            "192.168.10.104"

        ]

    },

    "group2": {

        "hosts": [

            "192.168.10.103",

            "192.168.13.5"

        ],

        "vars": {

            "ansible_ssh_port": 22,

            "ansible_connection": "ssh"

        }

    }

}

[root@ansible fang]#

按照以上的格式,來編寫我們的輸出吧,

SQL表格內容如下:

 

我想要輸出的json格式是這樣的

{組名:{

hosts:[‘ip1’,’ip2’],

vars:{

   “ansible_ssh_port”:22,

“ansilble_connection”:’ssh’

……….

}

}

}

腳本代碼列出來瞭如下:

#_*_coding:utf-8_*_

__author__ = 'fang'

import pymysql

import json

import argparse

import sys

 

def execude_sql(table):  #定義一個執行SQL的函數

    sql = 'select * from {0};'.format(table)

    cur.execute(sql)  #args即要傳入SQL的參數

    sys_result = cur.fetchall()

    #index = cur.description

    hostlist = {}#放入主機清單的信息

    for i in sys_result:

        hostlist[i[2]] = []

    for i in sys_result:

        hostlist[i[2]].append([i[1], i[5], i[6]])

    host_lists = dict()

    for i in hostlist.iteritems():

        dict_item = dict()

        for index in i[1]:

            dict_item[index[0]] = {'ansible_connection': index[1], 'ansible_ssh_port': index[2]}

        host_lists[i[0]] = dict_item

 

    # print json.dumps(host_lists, indent=4)

return host_lists

 

def group(data):

    '''

    all hostip

    :param data:

    :return:

    '''

    count_ip = dict()

    count_ip['all'] = {}

    count_ip['all']['hosts'] = []

    index = []

    for i in data:

        index.extend(data[i].keys())

    count_ip['all']['hosts'].extend(list(set(index)))

    print json.dumps(count_ip, indent=4)

 

def host(data, ip):

    dict_host = {}

    for i in data:

        if data[i].keys() == [ip]:

            dict_host[i] = {}

            dict_host[i]['hosts'] = [ip]

            dict_host[i]['vars'] = data[i][ip]

            print json.dumps(dict_host, indent=4)

            break

 

if __name__ == "__main__":

    global file, con, cur  #文件對象,連接和遊標對象

    #連接數據庫

    con = pymysql.connect('127.0.0.1', 'root', '', 'ansible', charset='utf8')  # 連接數據庫

    cur = con.cursor()  # 定義一個遊標 

    data = execude_sql('hosts_table')

# parser = argparse.ArgumentParser()#定義參數解析器

#獲取參數的方法1:

#以下是參數解析器添加參數格式,有—list和—host dest表示都可以通過args.list或者args.host來獲取到可變參數的值,action中store_true表存儲的是布爾值,當沒有—list的時候默認false,當有—list的時候,但是沒有值,默認則爲true,help表示幫助時候提示的信息,argparse很好用,在這裏恰當好處

    # parser.add_argument('--list',action='store_true',dest='list',help='get all hosts')

    # parser.add_argument('--host',action='store',dest='host',help='get sigle host')

    # args = parser.parse_args()

    # if args.list:

    #     group(data)

    # if args.host:

    #     host(data, args.host)

#獲取參數的方法2:

     if len(sys.argv) == 2 and (sys.argv[1] == '--list'):

            group(data)

     elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):

             host(data, sys.argv[2])

     else:

         print "Usage %s --list or --host <hostname>"% sys.argv[0]

         sys.exit(1)

坑 2: 動態inventory腳本要制定python的解釋器,否則無法執行

問題分析:

Ansible-playbook –I ansbile_inventory.py bb.yml執行

提示:無法識別host,還是出現了問題

對比ansible要求的格式,沒有差別,最後進行代碼的比對,問題出現在腳本沒有制定Python解釋器,導致出現的問題

解決辦法:

添加python解釋器的路徑

 

執行結果:

Yml文件

 

命令執行結果:

[root@ansible fang]# ansible-playbook -i ansible_inventory.py bb.yml

 

PLAY [192.168.10.104] *********************************************************************

TASK [debug] *********************************************************************

ok: [192.168.10.104] => {

    "msg": "this is test block"

}

TASK [file] *********************************************************************

ok: [192.168.10.104]

TASK [debug] *********************************************************************

ok: [192.168.10.104] => {

    "msg": "this is always"

}

PLAY RECAP *********************************************************************

192.168.10.104             : ok=3    changed=0    unreachable=0    failed=0  

 

[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104

{

    "xiaoming": {

        "hosts": [

            "192.168.10.104"

        ],

        "vars": {

            "ansible_ssh_port": 22,

            "ansible_connection": "ssh"

        }

    }

}

另外注意點:  --list    --host 正是通過yml中的hosts指定的內容,即爲腳本中命令行的參數的內容

 

問題:

參考網址:

https://blog.csdn.net/u011244839/article/details/80070648

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章