Ansible的基礎元素和YAML介紹
本節內容:
- YAML
- Ansible常用的數據類型
- Ansible基礎元素
一、YAML
1. YAML介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性:
- YAML的可讀性好
- YAML和腳本語言的交互性好
- YAML使用實現語言的數據類型
- YAML有一個一致的信息模型
- YAML易於實現
- YAML可以基於流來處理
- YAML表達能力強,擴展性好
更多的內容及規范參見http://www.yaml.org。
2. YAML語法
YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。下面是一個示例。YAML是用鍵值對和縮進來表示的。
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
YAML文件擴展名通常為.yaml,如example.yaml。
二、Ansible常用的數據類型
1. list
列表中的所有元素都使用“-”打頭,例如:A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
2. dictionary
字典通過key與value進行標識,例如:
---
An employee record:
name: Example Developer job: Developer skill: Elite
也可以將key:value放置於{}中進行表示,例如:
---
An employ record:
{name: Example Developer, job: Developer, skill: Elite}
三、Ansible基礎元素
1. 變量
(1)變量命名
變量名僅能由字母、數字和下划線組成,而且只能以字母開頭。
(2)facts
facts是由正在通信的遠程目標主機發回的信息,這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的所有facts,可使用如下命令進行:
# ansible hostname -m setup
(3)register
把任務的輸出定義為變量,然后用於其他任務,示例如下:
tasks: - shell: /usr/bin/foo register: foo_result ignore_errors: True
(4)通過命令行傳遞變量
在運行playbook的時候也可以傳遞一些變量供playbook使用,示例如下:
ansible-playbook test.yml --extra-vars "hosts=www user=magedu"
就是說hosts和user這兩個變量可以在test.yml文件中直接調用
(5)通過roles傳遞變量
當給一個主機應用角色的時候可以傳遞變量,然后在角色內使用這些變量,示例如下:
- hosts: webservers roles: - common - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
注意:role、dir、port是變量名,冒號后面的是變量值。
2. Inventory
ansible的主要功能在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認的inventory file為/etc/ansible/hosts。
inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成。
(1)inventory文件格式
inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸並到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號標明。
[webservers] www1.wisedu.com:8888 www2.wisedu.com
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機,例如:
[webservers] www[01:50].example.com [databases] db-[a:f].example.com
(2)主機變量
可以在inventory中定義主機時為其添加主機變量以便於在playbook中使用,例如:
[webservers] www1.wisedu.com http_port=80 maxRequestsPerChild=808 www2.wisedu.com http_port=8080 maxRequestsPerChild=909
(3)組變量
組變量是指賦予給指定組內所有主機上的在playbook中可用的變量。例如:
[webservers] www1.wisedu.com www2.wisedu.com [webservers:vars] # 表示向webservers這組主機定義變量如下,回頭這兩台主機上都可以調用變量ntp_server和nfs_server ntp_server=ntp.wisedu.com nfs_server=ntp.wisedu.com
(4)組嵌套
inventory中,組還可以包含其它的組,並且也可以向組中的主機指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如:
[apache] httpd1.wisedu.com httpd2.wisedu.com [nginx] ngx1.wisedu.com ngx2.wisedu.com [webservers:children] # 注意:children是固定格式 apache nginx [webservers:vars] ntp_server=ntp.wisedu.com
(5)inventory參數
ansible基於ssh連接inventory中指定的遠程主機時,還可以通過參數指定其交互方式,這些參數如下所示: