1. 程式人生 > >Ansible 之動態Inventory文件(二)

Ansible 之動態Inventory文件(二)

info 格式 配置 .py 參數 需要 print aws 更新

  上篇主要講解了Ansible 的安裝和配置,並且根據不同的業務場景將服務器的信息存放在Ansible的Inventory中,其實存放這樣的數據每次更新都需要我們自動的添加和刪除,這樣對於我們維護起來很不方便,而Ansible 提供了支持動態的從外部獲取主機列表和主機組數據;一般情況動態獲取主機信息都會結合CMDB、Zabbix、Cpbbler、雲主機管理平臺(如AWS、阿裏雲)在一起使用;

  Ansible 動態Inventory 是通過調用外部腳本生成指定格式的json數據,這裏不會限制任何語言,只要可以返回指定格式即可,下面看下我們需要返回什麽樣子的格式;

 {
        
"webserver": # 定義webserver組 { "hosts": ["39.105.0.244"], # webserver 組內主機 "vars": { # 參數 "ansible_ssh_pass": "123456", # Inventory 內置變量 "ansible_port": "61821" } }, "dbserver": {
"hosts": ["47.104.149.180"], "vars": { "ansible_ssh_pass": "123456", "ansible_port": "61821" } } }

  切記上面的hosts,vars還有children這些變量是固定的,我們不能在返回的json格式裏面隨意的定義,如果定義成為其他的這裏就會出現報錯,下面我們把上面的json數據轉換為靜態的Inventory數據,看下映射關系

[webserver]
    39.105.0.244

[dbserver]
    47.104.149.180

[webserver:vars]
    ansible_ssh_pass: "123456",
     ansible_port: "61821"

[dbserver:vars]
     ansible_ssh_pass: "123456",
     ansible_port: "61821"

  通過映射關系我們可以把對/etc/ansible/hosts 數據 和動態獲取Inventory數據的對比下,動態的只是通過其他的地方獲取數據組合成為Ansible Inventory 可識別的數據而已;

下面我們通過python語言來實現一個demo程序,這裏我們把自己的數據源定義成為變量,下面我們來看下例子

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json


def inventory_groups():
    groups =         {
        "webserver":  # 定義webserver組
            {
            "hosts": ["39.105.0.244"],  # webserver 組內主機
            "vars": {  # 參數
                "ansible_ssh_pass": "123456",  # Inventory 內置變量
                "ansible_port": "61821"
                }
            },
        "dbserver":
            {
            "hosts": ["47.104.149.180"],
            "vars": {
                "ansible_ssh_pass": "123456",
                "ansible_port": "61821"
                    }
            }
        }

    return json.dumps(groups, indent=4)


if __name__ == __main__:
    print(inventory_groups())

我們在Ansible 運行下我們寫好的腳本,首先我們指定webserver 執行ping操作

    ansible -i inventory.py webserver -m ping

執行命令以後返回:

技術分享圖片

這裏返回的結果集與我們在/etc/ansible/hosts配置服務器組返回結果一致,其實動態只是讓你更加便利的維護服務器組數據。

註意:

  ansible -i 參數代表指定Inventory 文件,但是我們指定文件以後還需要指定運行的服務器組或者服務器,如果需要所有的服務器都執行那麽我們這裏通過all 來實現。

技術分享圖片

Ansible 之動態Inventory文件(二)