Ansible 五(inventory檔案 主機清單)
Ansible 可同時操作屬于一個組的多台主機,組和主機之間的關系通過 inventory 檔案配置. 預設的檔案路徑為 /etc/ansible/hosts
主機群組
/etc/ansible/hosts 檔案的格式與windows的ini配置檔案類似:
<code>mail.example.com</code>
<code>[webservers]</code>
<code>foo.example.com</code>
<code>bar.example.com</code>
<code>[dbservers]</code>
<code>one.example.com</code>
<code>two.example.com</code>
<code>three.example.com</code>
方括号[]中是組名,用于對系統進行分類,便于對不同系統進行個别的管理.
一個系統可以屬于不同的組,比如一台伺服器可以同時屬于 webserver組 和 dbserver組.這時屬于兩個組的變量都可以為這台主機所用,至于變量的優先級關系将于以後的章節中讨論.
如果有主機的SSH端口不是标準的22端口,可在主機名之後加上端口号,用冒号分隔.SSH 配置檔案中列出的端口号不會在 paramiko 連接配接中使用,會在 openssh 連接配接中使用.
端口号不是預設設定時,可明确的表示為:
<code>badwolf.example.com:</code><code>5309</code>
假設你有一些靜态IP位址,希望設定一些别名,但不是在系統的 host 檔案中設定,又或者你是通過隧道在連接配接,那麼可以設定如下:
<code>jumper ansible_ssh_port</code><code>=</code><code>5555</code> <code>ansible_ssh_host</code><code>=</code><code>192.168</code><code>.</code><code>1.50</code>
在這個例子中,通過 “jumper” 别名,會連接配接 192.168.1.50:5555.記住,這是通過 inventory 檔案的特性功能設定的變量. 一般而言,這不是設定變量(描述你的系統政策的變量)的最好方式.後面會說到這個問題.
一組相似的 hostname , 可簡寫如下:
<code>www[</code><code>01</code><code>:</code><code>50</code><code>].example.com</code>
數字的簡寫模式中,01:50 也可寫為 1:50,意義相同.
你還可以定義字母範圍的簡寫模式:
<code>[databases]</code>
<code>db</code><code>-</code><code>[a:f].example.com</code>
對于每一個 host,你還可以選擇連接配接類型和連接配接使用者名:
<code>[targets]</code>
<code>localhost ansible_connection</code><code>=</code><code>local</code>
<code>other1.example.com ansible_connection</code><code>=</code><code>ssh ansible_ssh_user</code><code>=</code><code>mpdehaan</code>
<code>other2.example.com ansible_connection</code><code>=</code><code>ssh ansible_ssh_user</code><code>=</code><code>mdehaan</code>
所有以上讨論的對于 inventory 檔案的設定是一種速記法,後面我們會讨論如何将這些設定儲存為 ‘host_vars’ 目錄中的獨立的檔案.
主機變量
前面已經提到過,配置設定變量給主機很容易做到,這些變量定義後可在 playbooks 中使用:
<code>[atlanta]</code>
<code>host1 http_port</code><code>=</code><code>80</code> <code>maxRequestsPerChild</code><code>=</code><code>808</code>
<code>host2 http_port</code><code>=</code><code>303</code> <code>maxRequestsPerChild</code><code>=</code><code>909</code>
組的變量
也可以定義屬于整個組的變量:
<code>host1</code>
<code>host2</code>
<code>[atlanta:</code><code>vars</code><code>]</code>
<code>ntp_server</code><code>=</code><code>ntp.atlanta.example.com</code>
<code>proxy</code><code>=</code><code>proxy.atlanta.example.com</code>
把一個組作為另一個組的子成員
可以把一個組作為另一個組的子成員,以及配置設定變量給整個組使用. 這些變量可以給 /usr/bin/ansible-playbook 使用,但不能給 /usr/bin/ansible 使用:
<code>[raleigh]</code>
<code>host3</code>
<code>[southeast:children]</code>
<code>atlanta</code>
<code>raleigh</code>
<code>[southeast:</code><code>vars</code><code>]</code>
<code>some_server</code><code>=</code><code>foo.southeast.example.com</code>
<code>halon_system_timeout</code><code>=</code><code>30</code>
<code>self_destruct_countdown</code><code>=</code><code>60</code>
<code>escape_pods</code><code>=</code><code>2</code>
<code>[usa:children]</code>
<code>southeast</code>
<code>northeast</code>
<code>southwest</code>
<code>northwest</code>
如果你需要存儲一個清單或hash值,或者更喜歡把 host 和 group 的變量分開配置,請看下一節的說明.
分檔案定義host和group變量
在 inventory 主檔案中儲存所有的變量并不是最佳的方式.還可以儲存在獨立的檔案中,這些獨立檔案與 inventory 檔案保持關聯. 不同于 inventory 檔案(INI 格式),這些獨立檔案的格式為 YAML.詳見 YAML 文法http://www.ansible.com.cn/docs/YAMLSyntax.html .
假設 inventory 檔案的路徑為:/etc/ansible/hosts
假設有一個主機名為 ‘foosball’, 主機同時屬于兩個組,一個是 ‘raleigh’, 另一個是 ‘webservers’. 那麼以下配置檔案(YAML 格式)中的變量可以為 ‘foosball’ 主機所用.依次為 ‘raleigh’ 的組變量,’webservers’ 的組變量,’foosball’ 的主機變量:
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>webservers</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>host_vars</code><code>/</code><code>foosball</code>
舉例來說,假設你有一些主機,屬于不同的資料中心,并依次進行劃分.每一個資料中心使用一些不同的伺服器.比如 ntp 伺服器, database 伺服器等等. 那麼 ‘raleigh’ 這個組的組變量定義在檔案 ‘/etc/ansible/group_vars/raleigh’ 之中,可能類似這樣:
<code>-</code><code>-</code><code>-</code>
<code>ntp_server: acme.example.org</code>
<code>database_server: storage.example.org</code>
這些定義變量的檔案不是一定要存在,因為這是可選的特性.
還有更進一步的運用,你可以為一個主機,或一個組,建立一個目錄,目錄名就是主機名或組名.目錄中的可以建立多個檔案, 檔案中的變量都會被讀取為主機或組的變量.如下 ‘raleigh’ 組對應于 /etc/ansible/group_vars/raleigh/ 目錄,其下有兩個檔案 db_settings 和 cluster_settings, 其中分别設定不同的變量:
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code><code>/</code><code>db_settings</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code><code>/</code><code>cluster_settings</code>
‘raleigh’ 組下的所有主機,都可以使用 ‘raleigh’ 組的變量.當變量變得太多時,分檔案定義變量更友善我們進行管理群組織. 還有一個方式也可參考,詳見 Ansible Vault http://www.ansible.com.cn/docs/playbooks_vault.html關于組變量的部分. 注意,分檔案定義變量的方式隻适用于 Ansible 1.4 及以上版本.
Tip: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目錄可放在 inventory 目錄下,或是 playbook 目錄下. 如果兩個目錄下都存在,那麼 playbook 目錄下的配置會覆寫 inventory 目錄的配置.
Tip: 把你的 inventory 檔案 和 變量 放入 git repo 中,以便跟蹤他們的更新,這是一種非常推薦的方式.
inventory參數的說明
<code>ansible_ssh_host</code>
<code>将要連接配接的遠端主機名.與你想要設定的主機的别名不同的話,可通過此變量設定.</code>
<code>ansible_ssh_port</code>
<code> </code><code>ssh端口号.如果不是預設的端口号,通過此變量設定.</code>
<code>ansible_ssh_user</code>
<code> </code><code>預設的 ssh 使用者名</code>
<code>ansible_ssh_pass</code>
<code> </code><code>ssh 密碼(這種方式并不安全,我們強烈建議使用 </code><code>-</code><code>-</code><code>ask</code><code>-</code><code>pass</code> <code>或 SSH 密鑰)</code>
<code>ansible_sudo_pass</code>
<code> </code><code>sudo 密碼(這種方式并不安全,我們強烈建議使用 </code><code>-</code><code>-</code><code>ask</code><code>-</code><code>sudo</code><code>-</code><code>pass</code><code>)</code>
<code>ansible_sudo_exe (new </code><code>in</code> <code>version </code><code>1.8</code><code>)</code>
<code> </code><code>sudo 指令路徑(适用于</code><code>1.8</code><code>及以上版本)</code>
<code>ansible_connection</code>
<code> </code><code>與主機的連接配接類型.比如:local, ssh 或者 paramiko. Ansible </code><code>1.2</code> <code>以前預設使用 paramiko.</code><code>1.2</code> <code>以後預設使用 </code><code>'smart'</code><code>,</code><code>'smart'</code> <code>方式會根據是否支援 ControlPersist, 來判斷</code><code>'ssh'</code> <code>方式是否可行.</code>
<code>ansible_ssh_private_key_file</code>
<code> </code><code>ssh 使用的私鑰檔案.适用于有多個密鑰,而你不想使用 SSH 代理的情況.</code>
<code>ansible_shell_type</code>
<code> </code><code>目标系統的shell類型.預設情況下,指令的執行使用 </code><code>'sh'</code> <code>文法,可設定為 </code><code>'csh'</code> <code>或 </code><code>'fish'</code><code>.</code>
<code>ansible_python_interpreter</code>
<code> </code><code>目标主機的 python 路徑.适用于的情況: 系統中有多個 Python, 或者指令路徑不是</code><code>"/usr/bin/python"</code><code>,比如 \</code><code>*</code><code>BSD, 或者 </code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python</code>
<code> </code><code>不是 </code><code>2.X</code> <code>版本的 Python.我們不使用 </code><code>"/usr/bin/env"</code> <code>機制,因為這要求遠端使用者的路徑設定正确,且要求 </code><code>"python"</code> <code>可執行程式名不可為 python以外的名字(實際有可能名為python26).</code>
<code> </code><code>與 ansible_python_interpreter 的工作方式相同,可設定如 ruby 或 perl 的路徑....</code>
一個主機檔案的例子:
<code>some_host ansible_ssh_port</code><code>=</code><code>2222</code> <code>ansible_ssh_user</code><code>=</code><code>manager</code>
<code>aws_host ansible_ssh_private_key_file</code><code>=</code><code>/</code><code>home</code><code>/</code><code>example</code><code>/</code><code>.ssh</code><code>/</code><code>aws.pem</code>
<code>freebsd_host ansible_python_interpreter</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>local</code><code>/</code><code>bin</code><code>/</code><code>python</code>
<code>ruby_module_host ansible_ruby_interpreter</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>ruby.</code><code>1.9</code><code>.</code><code>3</code>
<code></code>
本文轉自506554897 51CTO部落格,原文連結:http://blog.51cto.com/506554897/1954872,如需轉載請自行聯系原作者