大多數格式化語言以非人類可讀的格式顯示數據。即使是最流行的數據格式 JSON,其代碼可讀性也很差。YAML 是 JSON 的替代方案,它以自然、易于閱讀和簡潔的方式格式化數據。本文將向您介紹 YAML 標記語言。我們介紹了這種標記語言背后的基本概念,解釋了它的主要特性,并展示了 YAML提供了什么。
什么是 YAML?
YAML 是一種數據序列化語言。早在 2001 年問世時,YAML 就代表“又一種標記語言”。該首字母縮寫詞后來更改為“?YAML Ain't Markup Language?”,以強調該語言旨在用于數據而不是文檔。
它不是真正意義上的編程語言。YAML 文件存儲信息,因此它們不包括操作和決策。
與 XML 或 JSON 不同,YAML 以一種易于人類閱讀的方式呈現數據。簡單的語法不會影響語言的功能。添加到 XML 或 JSON 文件的任何數據或結構也可以存儲在 YAML 中。
除了人類可讀的代碼外,YAML 還具有以下特點:
- 跨語言數據可移植性
- 一致的數據模型
- 一次性處理
- 易于實施和使用
用戶可以用任何編程語言編寫代碼來讀取和生成 YAML。YAML 中的擴展名是.yaml和.yml。兩個擴展名代表相同的文件類型。
Yaml 功能
YAML 具有多項功能,使其成為數據格式化的絕佳選擇。
多文檔支持
用戶可以將多個文檔添加到單個 YAML 文件中。用三個破折號 ( ) 分隔不同的文檔---
,如下所示:
--- 時間:19:04:12 玩家:playerOne 行動:罷工(小姐) --- 時間:20:03:47 玩家:playerTwo 動作:打擊(擊中) ...
三個點(“?……?”)標記文檔的結尾,而不是開始一個新的。
內置評論
YAML 允許用戶在他們的代碼中添加注釋。YAML 注釋以#
?符號開頭,不必位于單獨的行:
key: #這是單行注釋 ?? - 價值線 10 ?? #這是一個 ?? #多行注釋 ?? - 價值線 20
干凈的語法
與 Python 一樣,YAML 依賴縮進來顯示數據中的級別和結構。沒有常用的格式符號,例如大括號、方括號、結束標記或引號。語法簡潔且易于瀏覽。
簡潔的語法是一些流行工具依賴 YAML 的原因,例如Ansible、Kubernetes 和 OpenStack。
沒有標簽
YAML 不允許制表符??崭袷菍崿F縮進的唯一方法。
最好在文本編輯器中顯示空白字符,以防止意外使用制表符。
精準反饋
YAML 反饋是指文件中的特定行。當您知道在哪里查找時,您可以快速找到并修復錯誤。
支持復雜結構
YAML 提供了引用其他數據對象的能力。通過引用,您可以在 YAML 文件中編寫遞歸數據并構建高級數據結構。
帶有標簽的顯式數據類型
YAML 自動檢測數據類型,但用戶可以自由指定他們需要的類型。要指定數據類型,請包含“??!”?象征:
# 值應該是一個整數: is-an-int: !!int 5.6 # 將任意值轉換為字符串: is-a-str: !!str 90.88 # 下一個值應該是一個布爾值: is-a-bool: !!bool 是的
沒有可執行的命令
YAML 是一種數據表示格式。沒有可執行命令,這使得該語言在與第三方交換文件時非常安全。
如果用戶希望添加可執行命令,YAML 必須與其他語言集成。例如,添加 Perl 解析器以啟用 Perl 代碼執行。
YAML 的工作原理
YAML 匹配敏捷方法的原生數據結構及其語言,例如 Perl、Python、PHP、Ruby 和 JavaScript。它還派生了其他語言的功能:
- 標量、列表和數組來自 Perl。
- 三破折號分隔符來自 MIME。
- 空格包裝來自 HTML。
- 轉義序列來自 C.
YAML 支持所有基本數據類型,包括空值、數字、字符串、數組和映射。它識別一些特定于語言的數據類型,例如日期、時間戳和特殊數值。
冒號和一個空格定義一個標量(或變量):
字符串:“17” 整數:17 浮動:17.0 布爾值:否
|
字符表示保留換行符的字符串,字符>
?表示折疊換行符的字符串:
數據:| ?? 每個人 ?? 這些 ?? 換行符 ?? 將會 ?? 破碎。 數據:> ?? 本文 ?? 被包裹 ?? 還會 ?? 形成 ?? 一個段落。
除了基礎知識之外,您還需要了解 YAML 中兩種重要的結構類型:
- YAML 列表
- YAML 映射
在 YAML 中使用這兩種結構進行格式化。
YAML 映射(帶示例)
地圖關聯名稱-值對,這是設置數據的一個重要方面。YAML 配置文件可以這樣開始:
--- api版本:v3 種類:豆莢
這是相同文件打開的 JSON 等價物:
{ ?? "apiVersion": "v3", ?? “種類”:“豆莢” }
兩個代碼都有兩個值,v3
和Pod
,映射到兩個鍵,apiVersion
?和kind
。在 YAML 中,引號是可選的,并且沒有括號。
這種標記語言允許您通過創建映射到另一個映射而不是字符串的鍵來指定更復雜的結構。請參閱下面的 YAML 示例:
--- api版本:v3 種類:豆莢 元數據: ? 名稱:RSS網站 ? 標簽: ??? 應用程序:網絡
我們有一個鍵 (?metadata
) 和另外兩個鍵作為它的值name
和labels
。該labels
?鍵具有另一個映射作為其值。YAML 允許您根據需要嵌套地圖。
空格的數量無關緊要,但它必須在整個文件中保持一致。在我們的示例中,為了便于閱讀,我們使用了兩個空格。Name
并且labels
具有相同的縮進級別,因此處理器知道兩者都是同一映射的一部分。
相同的映射在 JSON 中如下所示:
{ ? "apiVersion": "v3", ? “種類”:“豆莢”, ? “元數據”:{ ?????????????? “名稱”:“RSS站點”, ?????????????? “標簽”: { ????????????????????????? “應用程序”:“網絡” ???????????????????????? } ????????????? } }
YAML 列表(附示例)
YAML 列表是一系列項目。例如:
參數: ? - 關掉 ? - “1000” ? - 味精 ? - “重啟系統”
一個列表可以包含任意數量的項目。項目以破折號開頭,而縮進將其與父項分開。您還可以將地圖存儲在列表中:
--- api版本:v3 種類:豆莢 元數據: ? 名稱:RSS網站 ? 標簽: ??? 應用程序:網絡 規格: ? 容器: ??? - 名稱:前端 ????? 圖片:nginx ????? 端口: ??????? - 容器端口:80 ??? - 名稱:RSS閱讀器 ????? 圖片:nickchase/rss-php-nginx:v1 ????? 端口: ??????? - 容器端口:88
我們有一個容器(對象)列表。每個都由名稱、圖像和端口列表組成。ports 下的每一項都是一個映射,列出了containerPort
?及其值。
我們的示例在 JSON 中看起來像這樣:
{ “apiVersion”: “v3”, “kind”: “Pod”, “元數據”: { “name”: “rss-site”, “labels”: { “app”: “web” } }, “spec” : { “containers”: [{ “name”: “front-end”, “image”: “nginx”, “ports”: [{ “containerPort”: “80” }] }, { “name”: “rss -reader”、“image”:“nickchase/rss-php-nginx:v1”、“ports”:[{“containerPort”:“88”}] }] } }
YAML 和 JSON 有什么區別?
JSON 和 YAML 可以互換使用,它們的用途相同。但是,兩者之間存在顯著差異:
YAML | JSON |
---|---|
易于人類閱讀 | 人類難以閱讀 |
允許評論 | 暫無評論 |
空格字符決定層次結構 | 方括號和大括號表示數組和對象 |
字符串引號支持單引號和雙引號 | 字符串必須用雙引號 |
根節點可以是任何有效的數據類型 | 根節點是一個對象或一個數組 |
YAML 和 JSON 的主要區別在于代碼的可讀性。最好的例子是官方 YAML 主頁。該網站本身是有效的 YAML,但人類很容易閱讀。
YAML 是 JSON 的超集。如果將 JSON 直接粘貼到 YAML 文件中,它會通過 YAML 解析器解析相同的內容。用戶還可以在兩種格式之間轉換大多數文檔??梢栽诰€將 JSON 文件轉換為 YAML,也可以使用Syck 或 XS 等工具。
IaC 中的 YAML
YAML 是為Infrastructure as Code編寫配置文件時的常用選項。這些文件存儲所需云環境的參數和設置。
Red Hat 的 Ansible 是最受歡迎的 IaC 工具之一,它使用 YAML 進行文件管理。Ansible 用戶創建所謂的用 YAML 代碼編寫的劇本,這些劇本可以自動執行配置和部署云環境的手動任務。
在下面的示例中,我們定義了一個 Ansible 劇本verify-apache.yml:
--- - 主機:網絡服務器 變量: ??? http_port:90 ??? 最大客戶數:250 ? 遠程用戶:根 ? 任務: ? - 名稱:確保 apache 是最新版本 ??? 百勝: ????? 名稱:httpd ????? 狀態:最新 ? - 名稱:編寫 apache 配置文件 ??? 模板: ????? 源代碼:/srv/httpd.j2 ????? 目標:/etc/httpd.conf ??? 通知: ??? - 重啟阿帕奇 ? - 名稱:確保 apache 正在運行 ??? 服務: ????? 名稱:httpd ????? 狀態:開始 ? 處理程序: ??? - 名稱:重啟apache ????? 服務: ??????? 名稱:httpd ??????? 狀態:重啟
此 YAML 劇本中有三個任務:
yum
?我們使用該命令將 Apache 更新到最新版本。- 我們使用模板來復制 Apache 配置文件。然后 playbook 重新啟動 Apache 服務。
- 我們啟動 Apache 服務。
設置后,將從命令行運行劇本。雖然路徑因設置而異,但以下命令運行 playbook:
ansible-playbook -i 主機/組 verify_apache.yml