YAML語法基礎(K8s基礎)

  對於YAML語言,網上有不少將YAML轉換爲JSON格式的在線轉換器,如下內容均可直接驗證,另外如有興趣更深刻學習YAML,可到其官方站點去學習,下面介紹的僅僅是比較經常使用的內容,並不是YAML語法的所有,由於還有不少高級用法,對於開發可能會更有幫助,這點須要說明。node

YAML 語言的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。
它的基本語法規則以下。
  • 大小寫敏感
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tab鍵,只容許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可

YAML支持的數據結構有三種。
  • 對象(Object):鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數組(Aarry):一組按次序排列的值,又稱爲序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值


以K8s中的示例來講明對象和數組:
apiVersion: apps/v1    #這是一個對象,key:value,這種形式的鍵值對,在yaml中就稱爲對象,也能夠叫字典 或 映射(map).
kind: ReplicaSet      #這也是對象
metadata:           #對象能夠是多個k:v 組合,這就是一個多k:v組合的對象。
 name: myapp
 namespace: default
spec:          #它也是對象,它更復雜點,它是複合型的對象
 replicas: 2
  selector:
   matchLabels:
    app: myapp
    release: canary
  template:
   metadata:
    name: myapp-pod
    labels:
     app: myapp
     release: canary
     environment:qa
   spec:
    containers:      #它的幫助信息中顯示,它的類型爲: <[]Object> ,但Yamy中,
               #它其實是一個對象類型,但這個對象的值是一個數組類型。
    -  name: myapp-container    #這是一個多屬性的數組,即一個數組有多個元素組成。
       image: busybox
       ports:        #它和containers同樣。也是一個對象類型,但值(value)是數組類型.
     -  name:http        #注意: 數組是以"-"開頭的.
      containerPort: 80
       -   name: https
      containerPort: 443

#對象數組類型比較容易混亂,我將其轉化爲單行形式的:【注意: YAML語法中,這種單行形式,稱爲流式(flow)語法】
  ports: [ {name: http, containerPort: 80 }, {name:https, containerPort: 443} ]
這樣看就能夠很容易看到: ports: VALUE 個格式, 但這個VALUE是一個數組,
而數組內部,每個元素又是一個對象,由於name:http 其實就是K:V,全部它就是一個對象。
和對象相對應的是值,即單個字符串: 以下面的數組的示例。

#這裏須要注意,數組還有一種形式是:
ports:
  -
    name: http
       containerPort: 80
  -
    name: https
  containerPort: 443
這樣寫,也表示"-" 下面的是數組的組成元素。YAML語法是須要使用空格對齊的!

#在YAML中表示一個這樣的數組: [Nginx, Hadoop, Apache]
#就能夠這樣寫:
  - Nginx
  - Hadoop   #像這樣單個字符串Hadoop,就是一個值,對象是K:V組合,所以要區分開。
  - Apachespring

還須要強調:
    關於對齊,YAML要求,同級別要對齊,不一樣級別錯位時,至少錯開一個空格,產生上下級層次,便可,沒有規定必須空出多少個空格。
    對於數組對象,由於它是以"-"橫線開頭,所以橫線可與上層持平,也不算錯,固然錯開也是能夠的。api


YAML語法中在同一個文件中寫多個配置段的語法:
server:
    address: 192.168.1.100
---      #在YAML格式中,使用三個橫線("---")表示一個配置段的開始.
spring:
    profiles: development
    server:
  address: 127.0.0.1
---
spring:
    profiles: production
    server:
  address: 192.168.1.120

YAML中在同一個文件中,寫兩個YAML文件的語法
#yaml文檔1
---          #三個橫線表示文檔開始
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...          #三個點表示文檔結束


#yaml文檔2
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...



數組

YAML中單引號和雙引號的區別和使用

s1: '內容\n字符串'
s2: "內容\n字符串"
用JavaScript表示:
  { s1: '內容\\n字符串', s2: '內容\n字符串' },能夠看到,單引號會轉義特殊字符,而雙引號不會轉義特殊字符.

str: 'labor''s day'
用JavaScript表示:
   { str: 'labor\'s day' },從這個示例中,能夠看到,雙寫單引號,能夠起到轉義後一個單引號的目的。


數據結構

YAML語法中的一些高級用法:

下面是一種數組的另外一種寫法
意思即對象的屬性是一個數組[key1, key2],對應的值也是一個數組[Value1, Value2]app

  

數據類型:

boolean:
  - TRUE      #true,True均可以
  - FALSE    #false,False均可以
float:
  - 3.14
  - 6.8523015e+5    #可使用科學計數法
int:
  - 123
  - 0b1010_0111_0100_1010_1110    #二進制表示
null:
  nodeName: 'node'
  parent: ~        #使用~表示null
string:
  - 哈哈
  - 'Hello world'      #可使用雙引號或者單引號包裹特殊字符
  - newline
    newline2       #字符串能夠拆成多行,每一行會被轉化成一個空格

date:
  - 2018-02-17      #日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime:
  - 2018-02-17T15:02:31+08:00    #時間使用ISO 8601格式,時間和日期之間使用T鏈接,最後使用+表明時區
oop

picture: !!binary |            # Base64 編碼的圖片數據. 這裏的"|",是YAML語法中的表示保留換行符的符號.
  R0lGODlhDAAMAIQAAP//9/X      #與"|" 相對的是 ">", 它表示 摺疊換行,即 不保留換行符, 換行符會被替換爲空格.
  17unp5WZmZgAAAOfn515eXv    #關因而否保留換行符,還有"|+" 和 「|-」參考下面
  Pz7Y6OjuDg4J+fn5OTk6enp            #注意:Base64編碼在書寫時,每行的前面必須有一個空格!!
  56enmleECcgggoBADs=

post

數據類型轉換:

string:
  - !!str 54321 #這種就是將int類型轉換爲字符串類型. 須要使用兩個歎號,便可。
  - !!str true學習

YAML中多行文本時,換行符保留與替換:

str: 這是一段
   多行
     字符串
用JavaScript表示: { str: '這是一段 多行 字符串' } ,換行符爲替換爲空格了。

this: |
    Foo
    Bar
用JavaScript表示: {this: 'Foo\nBar\n'} ,能夠看到每一個換行符都保留了。

s2: |+
    Foo
    abc
用JavaScript表示: {s2: 'Foo\nabc\n\n'}, 可看到,它保留了原始文本中的換號符,解析後還加入了一個換行符.

s3: |-
   Foo
   abc
用JavaScript表示: {s3: 'Foo\nabc},減號,就表示刪除文本塊末尾的換行符.

that: >
   Foo
   Bar
用JavaScript表示: {that: 'Foo Bar\n'},這個能夠看到,摺疊換行就是,只保留文本塊末尾的換行符.
注意: ">",也支持">-" 和 ">+" 以上和上面同樣。



this

錨點(&) 和 引用(*) 的組合使用:

示例1
hr:
   - Mark McGwire
   - &SS Sammy Sosa      #建立了一個錨點叫SS, 其值爲:Sammy Sosa
rbi:
   - *SS       #引用一個已經定義的錨點SS,這樣就引用了SS的值 Sammy Sosa。
   - Ken Griffey
用JavaScript語法: {rbi: [Sammy Sosa, Ken Griffey], hr: [Mark McGwire, Sammy Sosa]}

另外一種定義方法:
SS: &SS Sammy Sosa      #先定義一個對象,Key是SS,Value是一個錨點
hr:
    - Mark McGwire
    - *SS            #這裏引用錨點SS.獲得的結果和上面同樣。
rbi:
    - *SS
    - Ken Griffey

示例2
defaults: &defaults          #定義了一個錨點:叫defautls
     adapter: postgres
   host: localhost

development:
  database: myapp_development
  <<: *defaults        #這裏引用了defaults描點的值,並使用"<<"表示將其合併到當前對象(Object)或叫映射(map)中。

test:
  database: myapp_test
  <<: *defaults

合併後的結果,就至關於:
defaults:
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  adapter: postgres
  host: localhost

test:
  database: myapp_test
  adapter: postgres
  host: localhost

示例3:
merge:
  - &CENTER { x: 1, y: 2 }
  - &LEFT { x: 0, y: 2 }
  - &BIG { r: 10 }
  - &SMALL { r: 1 }

sample1:
  <<: *CENTER
  r: 10

sample2:
  << : [ *CENTER, *BIG ]
  other: haha

sample3:
  << : [ *LEFT, *BIG ]
  r: 100

合併就至關於下面:
sample1:
  x: 1
  y: 2
  r: 10

sample2:
  x: 1
  y: 2
  r: 10
  other: haha

sample3:
  x: 0
  y: 2
  r: 100 #sample3還引入了BIG,它的值是r:10,但sample3中已經有r:100了,所以引入後,sample3原始值會覆蓋引入的r:10.

相關文章
相關標籤/搜索