這是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的任務執行有很大幫助。