細說Ansible主機清單inventory

Ansible是一個系列文章,我會盡量以通俗易懂、詼諧幽默的總結方式給大家呈現這些枯燥的知識點,讓學習變的有趣一些。
Ansible系列博文直達鏈接:Ansible入門系列

前言

關於Ansible是什麼,我在之前的文章中沒有說;當然了,我這裏也不會說。當你看到我寫的這篇文章時,我想你已經知道了Ansible是什麼了,如果您還不知道什麼是Ansible是什麼,那我的建議是先去百度一下,知道了Ansible是什麼了,知道了Ansible能幹什麼了以後,再回過頭來繼續閱讀我這裏的總結。

在Ansible中,有兩個非常重要的概念,就是管理主機和被管理遠程主機。

  • 管理主機:就是管理遠程主機的主機;說簡單點,就是安裝Ansible整套軟件的主機;所有的Ansible管理命令都是從這臺管理主機發出的,通過這臺管理主機,從而實現對其它遠程主機的管理;
  • 被管理遠程主機:顧名思義,就是執行具體動作的主機;Ansible管理主機下達的命令,最終都要到被管理遠程主機上去落地執行。

上面也說了,管理主機就是安裝Ansible的主機,那被管理遠程主機的信息又在哪裏配置呢?下面就細說這個被管理遠程主機在Ansible中的全套配置和流程。

inventory簡介

inventory,也就是主機清單。在大規模的配置管理工作中,特別是雲服務提供商或者IDC廠家,需要管理不同業務的不同機器,這些機器的信息都存放在Ansible的inventory組件裏面。在我們使用Ansible進行遠程主機管理時,必須先將主機信息存放在inventory裏面,這樣才能使用Ansible對它進行操作。默認情況下,Ansible的inventory是一個靜態的INI格式的文件,在上一篇《Ansible配置文件ansible.cfg詳解》中說到了defaults配置中的inventory選項,這個inventory選項就是配置inventory文件的地方。當然了,我們還可以通過ANSIBLE_HOSTS環境變量指定或者運行ansible和ansible-playbook的時候用-i參數臨時設置。

定義主機和主機組

先來看個我在測試環境使用的inventory文件內容。

192.168.1.2
192.168.1.4

[web]
192.168.1.2
192.168.1.4

[mysql-db]
192.168.1.5
192.168.1.6

[east:children]
web
mysql-db

上述就是我的一個簡單配置,將來你在生產環境配置inventory的話,大抵上也就是這個樣子。下面我們分別細說一下上面的這個inventory配置文件。

  • 前兩行我們定義了兩個單獨的主機,對於單個主機,我們可以針對單個主機進行配置,包括變量等;
  • [web][mysql-db]是我們定義的兩個主機組;我們可以根據業務、地理位置等因素,對主機進行按組劃分,這樣方便統一批量管理;
  • [east:children]是我們定義的一個包含其它組的組;分組是支持嵌套的,這樣就更加方便了分組的管理。

定義了主機或主機組以後,我們就可以直接在命令中使用這些主機或主機組,比如這樣:

ansible 192.168.1.2 -m ping
ansible web -m ping
ansible east -m ping

定義inventory列表

默認情況下,Ansible的inventory文件是一個INI的靜態文件,其實Ansible還支持多個inventory文件,這樣我們就可以非常方便的管理不同業務或者不同環境的機器了。

要定義inventory列表,我們先新建一個存放inventory文件的文件夾,然後將ansible.cfg配置文件中inventory的值修改爲這個新建的文件夾的路徑。比如我在測試環境新建了一個名爲inventory文件夾來存放inventory配置文件。

使用tree /home/jelly/ansible/inventory命令輸出結果如下:

/home/jelly/ansible/inventory/
|---web
|---db

在這裏,我分別定義了兩個inventory配置文件,其中web文件中的內容如下:

[web]
192.168.1.2
192.168.1.4

其中db文件中的內容如下:

[mysql-db]
192.168.1.5
192.168.1.6

接下來,我們就可以正常使用這些inventory中的主機配置信息了,比如可以用以下命令來看看分組下的主機進行配置驗證:

ansible mysql-db --list-hosts

以後我們就可以使用這種方式來搞定inventory的配置了,當然了,對於管理主機少,配置簡單的環境,使用這種方式完全是沒有問題的。但是對於上千臺、上萬臺的主機,很顯然這種方式就大大不方便了,太落後了。對於這種上千臺、上萬臺的主機的環境,我們就需要動態的從CMDB中拉去主機配置信息了,此時就要說到下面的動態inventory了。

動態inventory

上面也說到了,對於那些雲服務提供商或者IDC廠家會有大量的主機列表;如果手動維護這些列表將是一個非常繁瑣的事情。其實Ansible是支持動態的inventory的,動態inventory就是Ansible所有的inventory文件裏面的主機列表和變量信息都是從外部拉取的。比如我們可以從CMDB系統和Zabbix監控系統拉取所有的主機信息,然後使用Ansible進行管理。這樣一來我們就可以很方便的將Ansible與其它運維繫統結合起來。關於引用動態inventory的功能配置起來是非常簡單的;我們只需要把ansible.cfg文件中inventory的定義值改成一個執行腳本即可。這個腳本的內容不受任何編程語言限制,但是這個腳本使用參數時有一定的規範並且對腳本執行的結果也有要求。這個腳本需要支持兩個參數:

  • --list或者-l:這個參數運行後會顯示所有的主機以及主機組的信息(JSON格式);
  • --host或者-H:這個參數後面需要指定一個host,運行結果會返回這臺主機的所有信息(包括認證信息、主機變量等),也是JSON格式。

下面就是我寫的一個通過Python腳本動態獲取主機列表和主機信息的腳本,由於腳本是用來演示的,所以沒有從數據庫中獲取主機列表和主機配置信息,在實際開發中,我們可以修改爲從數據庫獲取對應的數據:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import argparse
import json

def lists():
    r = {}
    h = ['192.168.1.2', '192.168.1.4']
    hosts = {'hosts':h}
    r['web'] = hosts
    return json.dumps(r, indent=4)

def hosts(name):
    r = {'ansible_ssh_user':'jelly', 'ansible_ssh_pass':'123456'}
    return json.dumps(r)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-l', '--list', help='hosts list', action='store_true')
    parser.add_argument('-H', '--host', help='hosts vars')
    args = vars(parser.parse_args())

    if args['list']:
        print(lists())
    elif args['host']:
        print(hosts(args['host']))
    else:
        parser.print_help()

接下來,我們先不修改ansible.cfg中的inventory配置,直接在命令行指定配置文件進行運行:

ansible -i inventoryDemo.py web -m ping

輸出結果如下:

192.168.1.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.1.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

在生產環境,我們需要將ansible.cfg中的inventory配置指定爲這個python腳本的路徑,後續正常執行各個ansible命令即可,比如這樣:

ansible web -m ping

inventory內置參數

Ansible inventory中可以配置很多內置的一些參數,這些參數在我們實際工作中非常有用,我們可以直接在inventory文件中定義它,也可以在動態的inventory中使用它們。這裏對這些常用inventory內置參數進行一下簡單的總結:

參數名 參數說明
ansible_ssh_host 定義主機的ssh地址
ansible_ssh_port 定義主機的ssh端口
ansible_ssh_user 定義主機的ssh認證用戶
ansible_ssh_pass 定義主機的ssh認證密碼
ansible_sudo 定義主機的sudo用戶
ansible_sudo_pass 定義主機的sudo密碼
ansible_sudo_exe 定義主機的sudo路徑
ansible_connection 定義主機連接方式;與主機的連接類型.比如:local,ssh或者paramiko;Ansible 1.2以前默認使用paramiko。1.2以後的版本默認使用‘smart’,‘smart’方式會根據是否支持ControlPersist,來判斷ssh方式是否可行
ansible_ssh_private_key_file 定義主機私鑰文件
ansible_shell_type 定義主機shell類型
ansible_python_interpreter 定義主機python解釋器路徑

總結

inventory是ansible中一個非常重要的概念,只有完全掌握了inventory的配置,我們纔會知道我們需要對哪些主機做哪些事。希望我這裏對inventory的總結能夠更好的幫助你理解inventory。因爲inventory是如此的重要,所以在後續的文章中,我還會總結到inventory的一些其它用法。最後,如果覺的還不錯,可以點擊下方的“打賞”哦。

2019年6月16日,於內蒙古呼和浩特。

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