Ansible系列(5):Inventory介紹,如何管理主機組

這是Ansible系列課程第五節,Ansible Inventory介紹。介紹一下Inventory是什么,以及如何管理主機組。

該系列課程前后章節都是有關聯性的,對于初學者建議按順序閱讀。也可以選擇特定的章節了解單個知識點。

Ansible可以遠程操作一臺或一組主機,這些主機的清單是在稱為inventory的文件中配置的。默認的inventory文件是/etc/ansible/hosts,也可以在命令行中通過參數-i來指定其他路徑下的inventory文件,或者從其他系統中動態獲取相同格式的清單,比如CMDB。

Inventory文件示例

inventory文件有INI和YAML兩種格式,建議INI格式。一個基本的inventory文件內容如下:

mail.example.com #單個主機地址

[webservers] #主機組, []內為組名

foo.example.com http_port=80? maxRequests=30 #定義主機變量

bar.example.com ansible_connection=ssh ansible_user=myuser #指定連接信息

[dbservers]

db-[1:5].example.com? #定義1-5范圍的主機

bar-[a:f].example.com #定義a-f范圍的主機

[all:vars] #定義全局變量

ansible_ssh_private_key_file=/root/.ssh/id_rsa

ansible_ssh_port=22

ansible_ssh_user=root

[dbservers:vars] #定義dbservers組的變量

mysql_port=3806

[server:children] #定義server組的子成員

webservers

dbservers

上面對文件配置做個介紹:

主機可以單獨配置、可以屬于一個或多個主機組

主機組定義的格式是:[groupname],如:[webservers],[dbservers]

主機組變量定義的格式是:[groupname:vars],如:[webservers:vars],[all:vars]

主機組嵌套定義的格式是:[parentgroup:children],如:[server:children]

自定義主機變量定義格式:如:foo.example.com http_port=80? maxRequests=30

內置主機變量定義格式:如:bar.example.com ansible_connection=ssh ansible_user=myuser

默認組

在inventory中,有2個默認組:all和ungrouped。

all:包含所有的主機

ungrouped:包含不屬于組的主機

盡管all和ungrouped永遠存在,但他們是隱式的,不會出現在任何組列表中。

多組共存

為了滿足不同的場景,會定義不同的組名,比如:

What:是什么,應用程序、數據庫還是緩存。

Where:在哪里,哪個數據中心或者區域,如Beijing,ShangHai

When:開發階段,開發環境、測試環境、生產環境

每個主機也可能會同時屬于多個組,如下面inventory所示,foo.example.com同時屬于webservers和east,one.example.com同時屬于dbservers和east等。

mail.example.com

[webservers]

foo.example.com

bar.example.com

[dbservers]

one.example.com

two.example.com

three.example.com

[east]

foo.example.com

one.example.com

[west]

bar.example.com

three.example.com

[prod:children]

east

[test:children]

west

Inventory中的變量

我們可以在Inventory文件中指定特定主機或特定組相關的變量,這些在前面的示例中也有說明。但隨著inventory中管理的節點越來越多,也可以通過變量文件的方式有效管理。

主機變量

添加主機變量很簡單,直接在主機后面添加key=value鍵值對,如下所示:

[webservers]

foo.example.com http_port=80? maxRequests=30

bar.example.com ansible_connection=ssh ansible_user=myuser

另外,也可以直接給主機起個別名,在后續playbook中直接使用別名即可,使用別名的主機,需要指定ansible_host參數。

jumper ansible_port=5555 ansible_host=192.0.2.50

組變量

如果組里的所有主機都需要相同的變量值,可以將變量添加到組上,格式如下:

[dbservers]

db-[1:5].example.com

bar-[a:f].example.com

[dbservers:vars]

mysql_port=3806

組變量是一種可以將變量同時應用到多個主機的方法。但是,在執行之前,Ansible需要將變量展平到host級別。如果一個主機同時屬于多個組,如果為不同組中的同一個變量指定了不同的值,該按什么規則選擇呢?在后面變量優先級部分會介紹。

嵌套組變量

inventory文件中對組的管理非常靈活,可以將多個組在封裝成一個新組,可以對這個新組指定變量。

[webservers]

foo.example.com

bar.example.com

[dbservers]

db-[1:5].example.com ?

bar-[a:f].example.com

[server:children] #利用已有的組封裝成新的組

webservers

dbservers

[server:vars] #嵌套組變量

connect_timeout=30

變量文件

雖然在Inventory文件中可以指定變量,但如果變量多了管理成本會很高,也會很混亂。Ansible中可以通過變量文件來管理組變量或主機變量,文件內容也是YAML語法。

Ansible通過搜索相對于inventory和playbook文件的路徑來加載host和group變量文件。假如:在/etc/ansible/hosts的inventory文件中包含一個名為foo.example.com的主機,分別屬于webservers和dbservers兩個組,那么該主機將從以下位置獲取變量:

/etc/ansible/group_vars/dbservers

/etc/ansible/group_vars/webservers

/etc/ansible/host_vars/foo.example.com

文件的格式如下:

---

ntp_server: acme.example.org

database_server: storage.example.org

有可以在playbook目錄下添加group_vars/host_vars/目錄,ansible-playbook命令默認會從當前工作目錄下查找這些目錄。但其他的ansible命令只會從inventory目錄下查找group_vars和host_vars,如ansible,ansible-console。如果要想讓這些命令也能從playbook目錄下查找,需要在命令行提供--playbook-dir參數。如果想從playbook和inventory這兩個地方加載變量,那么playbook目錄下的變量會覆蓋inventory目錄下的變量。

變量的優先級

默認情況下,在任務執行之前,所有的變量都會進行合并和鋪平然后應用到特定的host上,這就涉及到如果從多個數據源獲取變量,那么變量的優先級是什么樣的。

由低到高的順序:


默認情況下,ansible在同一級別按照字母的順序進行合并,后面加載的組覆蓋之前加載的組。比如,a_group和b_group進行合并,那么b_group組的變量將覆蓋a_group中的變量。

多源Inventory

在Ansible的最佳實踐中,建議按不同的環境劃分inventory文件,如果有個任務想同時在不同的環境中執行,這個時候就可以指定多個inventory文件,格式如下:

$ansible-playbookget_logs.yml-istaging-iproduction

當這兩個inventory文件中存在相同的變量時,也是按上面的優先級進行取舍。如:staging中變量a=1,production中a=2,那么按上面的命令,合并后的結果是a=2,如果想讓a=1,需要改變傳入的順序。

$ansible-playbookget_logs.yml-iproduction-istaging

主機內置變量清單

下面是ansible內置的變量清單,可以收藏備用。

主機連接配置

ansible_connection:與主機的連接類型。可以是ansible的連接插件的名稱。SSH協議類型為smart、ssh或paramiko。默認值是smart。

所有連接配置

ansible_host:要連接到遠程主機的名稱。

ansible_port:要連接到遠程主機的端口,默認為22。

ansible_user:連接到遠程主機的用戶名。

ansible_password:連接到遠程主機的用戶名密碼。

SSH連接配置

ansible_ssh_private_key_file:ssh使用的私有文件,適用于有多個秘鑰,但不想使用ssh agent情況。

ansible_ssh_common_args:該設置附加到默認的sftp、scp和ssh命令行上。

ansible_sftp_extra_args:該設置總是附加到默認的sftp命令行上。

ansible_scp_extra_args:該設置總是附加到默認的scp命令行上。

ansible_ssh_extra_args:該設置總是附加到默認的ssh命令行上。

ansible_ssh_pipelining:確定是否使用SSH pipelining,該參數會覆蓋ansible.cfg中的pipelining設置。

ansible_ssh_executable:此設置會覆蓋使用系統ssh的默認行為,會覆蓋ansible.cfg中的ssh_executable參數。

特權提升配置

ansible_become:允許特權升級,等同于ansible_sudo、ansible_su。

ansible_become_method:設置特權提升的方法,比如sudo。

ansible_become_user:設置特權提升的用戶,等同于ansible_sudo_user,`ansible_su_user

ansible_become_password:設置特權用戶的密碼,等同于ansible_sudo_password,ansible_su_password

ansible_become_exe:設置提權方法所用的可執行文件,等同于ansible_sudo_exe,ansible_su_exe

ansible_become_flags:設置提權方法所用的參數,等同于ansible_sudo_flags,ansible_su_flags

遠程主機環境配置

ansible_shell_type:目標系統的shell類型.默認情況下,命令的執行使用 'sh' 語法,可設置為 'csh' 或 'fish'。

ansible_python_interpreter:目標主機的 python 路徑.適用于的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python。

ansible_*_interpreter:這里的"*"可以是 ruby 或 perl 或其他語言的解釋器,作用和ansible_python_interpreter 類似。

ansible_shell_executable:這將設置ansible控制器將在目標機器上使用的shell,覆蓋ansible.cfg中的配置,默認為/bin/sh。

總結

這篇文章主要介紹了inventory文件以及inventory中涉及的group變量和host變量的設置。inventory文件在Ansible中是非常重要的一個組件,如何更有效、合理的管理主機,對于ansible的任務執行有很大幫助。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容