9.YAML
9.1簡介
(1)YAML是一個可讀性高的用來表達資料序列的格式。
(2)YAML參考了其它多種語言。包括:XML、C語言、python、perl以及電子郵件格式的RFC2822等。Clark Evans在2001年首次發表了這種語言。
(3)YAML不是XML,在開發這種語言時,YAML的意思實際上是:yet another markup language,
9.2特性
(1)YAML的可讀性好
(2)和腳本語言的交互性好
(3)使用語言的數據類型
(4)一致的信息模型
(5)易於實現
(6)基於流來處理
(7)表達能力強,擴展性好
9.3語法
(1)YAML的語法和其它高級語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。(2)其結構經過空格來展現,序列裏的項用「-」來表明。Map裏的鍵值對用「:」分割
同一個數據有多個時叫作序列
9.4數據類型
9.4.1鍵值對
(1)一個鍵對應一個值
Name:zhang //鍵值對
Age:24
Gender:male
(2)一個鍵對應多個值
Spouse: //也是鍵值對,採用縮進的方式,表示值是下邊的三項,
Name:wang
Age:24
Gender:female
(3)一個鍵對應兩個列表,一個列表裏有多個值
Children: python
- Name:kebi
Age:7
Gender:male
- Name:james
Age:8
Gender:female
//也是鍵值對,同一類數據有多個值時,叫作序列,每個數據項使用一個橫線「-」來引導,值是另一組鍵值對
![ansible YAML](http://static.javashuo.com/static/loading.gif)
9.4.2列表
列表的全部元素均使用「-」打頭,例如: A list of tasty fruits
- apple
- orange
- strawberry
- mango
9.4.3字典
字典經過key 與 value進行標識 Aemployee record
Name: zhang
Job:engineer
Skill:pragram
也能夠將key:value放置於{}中進行標識,例如nginx
an example record
{name:zhang,job:engineer,skill:pragram}
9.5基礎元素
9.5.1 facts
(1)facts是由正在通訊的遠程目標主機發回的信息,這些信息被保存在ansible變量中
(2)要獲取指定的遠程主機所支持的全部facts,可以使用以下命令
ansible hostname –m setup
9.5.2 register
(1)把任務的輸出定義爲變量,而後用於其餘任務
(2)實例以下
Tasks:
shell:/usr/bin/foo
register:foo_result
ignore_errors:true
9.5.3 max_fail_percentage
設置最大失敗的比率,好比設置25%,則若是有4臺機器,有2臺執行任務失敗則會終止整個play,其它任務再也不執行
max_fail_percentage:25
9.5.4 set_fact
能夠把好比register註冊的變量,裏邊多是一個json,而後取值以後使用set_fact
9.5.5 serial
指定每次在幾個hosts中執行
9.5.6 local_action&delegate_to: localhost
若是隻想在控制機器執行,而不是遠程機器執行,用這個,可是local_action有諸多限制,貌似只能使用它本身的參數web
- name: Deploy mezzanine
hosts: web
gather_facts: False vars & vars_files section not shown here
tasks:shell
- name: wait for ssh server to be running
local_action: wait_for port=22 host="{{ inventory_hostname }}" search_regex=OpenSSH
9.6變量
9.6.1變量組成
變量只能由字母數字下劃線組成,且只能以字母開頭
9.6.2經過命令行傳遞變量
(1)在運行playbook的時候也能夠傳遞一些變量供playbook使用
(2)示例以下:
ansible-playbook test.yml –extra-vars 「host=www user=zhang」
9.6.3經過roles來傳遞變量
(1)當給一個應用主機角色的時候能夠傳遞變量,而後在角色內使用這些變量
(2)實例以下:
- hosts:webservers
roles:
- common
- { role:foo_app_instance,dir:‘/web/htdocs/a.com’,port:8080}
Inventory
9.6.4定義主機時添加變量
(1)在inventory中定義主機時爲其添加主機變量以便在playbook中使用
(2)例如:
[webservers]
www.1.mage.com http_port=80 maxRequestsPerChild=80 定義主機時,有本身專用的變量,每一個子進程可以接受的最大訪問量
1.ansible_ssh_host # 要鏈接的主機名
2.ansible_ssh_port # 端口號默認是22
3.ansible_ssh_user # ssh鏈接時默認使用的用戶名
4.ansible_ssh_pass # ssh鏈接時的密碼
5.ansible_sudo_pass # 使用sudo鏈接用戶是的密碼
6.ansible_ssh_private_key_file # 祕鑰文件若是不想使用ssh-agent管理時能夠使用此選項
7.ansible_shell_type # shell的類型默認sh
8.ansible_connection # SSH 鏈接的類型: local , ssh , paramiko在 ansible 1.2 以前默認是 paramiko
9後來智能選擇,優先使用基於 ControlPersist 的 ssh (支持的前提)
ansiblepython interpreter #用來指定 python 解釋器的路徑,一樣能夠指定ruby 、perl 的路徑
9.6.5組變量
(1)組變量是指賦予給指定組內全部主機上的在playbook中可用的變量
(2)例如:
[webservers]
www1.mage.com
www2.mage.com
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
9.6.6組嵌套
(1)Inventory中,組還能夠包含其它的組,而且也能夠向組中的主機指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持
(2)例如:
nginx和apache是webserver的子組
9.6.7在配置文件中定義變量在配置文件中定義變量,而後在每一個主機上後邊跟上相關的值,就能夠將每一個主機的配置文件都設置爲適合本身的。