OpsRamp 및 Ansible 인벤토리 협력

16328 단어 opsrampAnsible
개요
Ansible에는 파일의 정적 재고 관리 외에도 재고 정보를 동적으로 관리하는'다이너믹 인벤토리'가 있습니다.
Developing Dynamnic Inventory
Dynamic Inventry를 사용하여 외부 시스템에서 인벤토리 정보를 가져올 수 있습니다.
OptsRamp은 Rest API를 제공하기 때문에'다이너믹 인벤토리'를 통해 협업할 수 있다.
OpsRamp API
Ansible Dynamic Inventory Script
Python 스크립트를 사용하여 외부 시스템과 협업합니다.
Inventory Script
파이썬 스크립트는 실행할 때 '--list' 와 '-host' 인자를 사용할 수 있으며, 실행 결과는 JSON 형식으로 되돌아와야 합니다.
다음은 샘플의 파이썬 스크립트입니다.
opsramp-inv.py
import requests
import json
import sys
import argparse


def getAuthKey(params):
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/json"
    }
    payload = {
        "grant_type": "client_credentials",
        "client_id": params["KEY"],
        "client_secret": params["SECRET"]
    }
    url = "https://{url}/auth/oauth/token".format(url=params['URL'])
    r = requests.post(url, headers=headers, data=payload)
    json_res = json.loads(r.text)

    return str(json_res["access_token"])


def getDeviceGroups(params):
    headers = {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": "Bearer "+params["AUTHKEY"]
    }
    url = "https://{url}/api/v2/tenants/{c_id}/deviceGroups/minimal".format(
        url=params["URL"],
        c_id=params["CLIENT_ID"]
    )
    r = requests.get(url, headers=headers)
    results = json.loads(r.text)

    return results


def getResourcesMinimal(params, deviceGroup):
    headers = {
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": "Bearer "+params["AUTHKEY"]
    }
    url = "https://{url}/api/v2/tenants/{c_id}/resources/minimal?deviceGroupId={deviceGroup}".format(
        url=params["URL"],
        c_id=params["CLIENT_ID"],
        deviceGroup=deviceGroup
    )
    r = requests.get(url, headers=headers)
    results = json.loads(r.text)

    return results


def get_inventory_from_opsramp(params):
    params.update({'AUTHKEY':getAuthKey(params)})
    deviceGroups = getDeviceGroups(params)
    print(deviceGroups)
    inventory = {}
    for deviceGroup in deviceGroups:
        groupName = deviceGroup["name"]
        resources = getResourcesMinimal(params, deviceGroup["id"])
        inventory.update({groupName: {'hosts': []}})
        for resource in resources:
            inventory[groupName]['hosts'].append(resource["ipAddress"])

    return inventory


def to_json(dict):
    return json.dumps(dict)


def parse_args():
    parser = argparse.ArgumentParser(description='OpsRamp Inventory Module')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--list', action='store_true', help='List active servers')
    group.add_argument('--host', help='List details about the specific host')

    return parser.parse_args()


def main():
    args = parse_args()
    params = {
            "URL": <API URL: OpsRamp設定上から取得>,
            "CLIENT_ID": <Client Id: OpsRamp設定上から取得>,
            "KEY": <API Key: OpsRamp設定上から取得>,
            "SECRET": <API Secret: OpsRamp設定上から取得>
    }
    if args.list:
        inventory = get_inventory_from_opsramp(params)
        output = to_json(inventory)
        print(output)
    elif args.host:
        output = {}
        print(output)
    sys.exit(0)


if __name__ == '__main__':
    main()
Requests 모듈을 사용하고 있습니다.
매개변수가 구현되지 않았습니다.
OpsRamp 설정
OpsRamp의 Rest API를 사용하려면 사용자 지정 포인트를 설정해야 합니다.
설정 방법에 대해서는 다음을 참조하십시오.
Custom Integration을 사용하여 쓰러뜨리기
결실
다음은 "ansible-inventry"의 실행 결과입니다.
bash
[root@ansible ansible]# ansible-inventory -i opsramp-inv.py  --list
{
    "TEST0001": {
        "hosts": [
            "192.168.0.205"
        ]
    },
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "TEST0001",
            "ungrouped"
        ]
    }
}
다음은 OpsRamp의 장치 그룹 설정입니다.

좋은 웹페이지 즐겨찾기