YAMLリンティングのベストプラクティス:デプロイ前にエラーを検出
YAMLファイルのスペース1つの間違いで、本番デプロイメントがダウンする可能性があります。構文エラーで派手に失敗するJSONとは異なり、YAMLは不正なインデントを予期しないデータ構造として黙って解析することがあります。リンティングはこれらの問題が本番に到達する前に検出します。
なぜYAMLをリントするのか?
YAMLの柔軟性は、その強みであり弱点でもあります:
# これは有効なYAMLですが、おそらく間違い
ports:
- 80
- 443
name: webserver # これはマッピングではなく、2番目のリストアイテムのキー!
上記は、2番目のアイテムがマッピング {443: null, name: webserver} であるリストを作成します。リンターはこのインデントの問題を検出します。リンティングなしでは、この種のバグの診断に何時間もかかることがあります。
yamllint:標準リンター
yamllint は最も広く使用されているYAMLリンターです。構文の有効性とスタイルの一貫性の両方をチェックします。
インストール
pip install yamllint
基本的な使い方
# 単一ファイルのリント
yamllint config.yaml
# ディレクトリのリント
yamllint .
# 特定の設定でリント
yamllint -c .yamllint.yml .
設定
プロジェクトルートに .yamllint.yml を作成:
extends: default
rules:
line-length:
max: 120
level: warning
indentation:
spaces: 2
indent-sequences: true
truthy:
allowed-values: ['true', 'false', 'yes', 'no']
comments:
require-starting-space: true
min-spaces-from-content: 2
document-start: disable
empty-lines:
max: 1
主要ルールの説明
| ルール | 目的 | 推奨設定 |
|---|---|---|
indentation | 一貫したインデントの適用 | 2スペース、タブなし |
line-length | 過度に長い行の防止 | 120文字(警告) |
truthy | 真偽値の制御 | true/false のみ |
comments | コメントのフォーマット | # の後にスペース必須 |
document-start | 先頭に --- を要求 | 無効(任意) |
trailing-spaces | 末尾の空白禁止 | 有効 |
new-line-at-end-of-file | 一貫したファイル末尾 | 有効 |
リンティングで検出される一般的なエラー
1. タブ文字
YAMLはインデントにタブを禁止していますが、エディターが挿入することがあります:
# エラー:タブ文字
server:
port: 8080 # スペースではなくタブ!
2. 一貫性のないインデント
# エラー:2スペースと4スペースのインデントが混在
database:
host: localhost
port: 5432 # 誤り:2スペースではなく4スペース
3. 重複キー
# エラー:重複キー(2番目が最初を黙ってオーバーライド)
server:
port: 8080
host: localhost
port: 9090 # 重複!どのポートが使用される?
4. 末尾のスペース
見えない末尾のスペースは、特にマルチライン文字列で予期しない動作を引き起こすことがあります。リンターはこれらを即座にフラグします。
何もインストールせずにすばやく検証:YAMLをYAMLバリデーターに貼り付けてください。
CI/CD統合
GitHub Actions
name: YAML Lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install yamllint
run: pip install yamllint
- name: Lint YAML files
run: yamllint .
Pre-commitフック
# .pre-commit-config.yaml
repos:
- repo: https://github.com/adrienverge/yamllint
rev: v1.33.0
hooks:
- id: yamllint
args: [-c, .yamllint.yml]
pip install pre-commit
pre-commit install
これにより、コミットごとにYAMLが自動的にリントされます。
GitLab CI
yaml-lint:
image: python:3.12-slim
script:
- pip install yamllint
- yamllint .
rules:
- changes:
- "**/*.yaml"
- "**/*.yml"
エディター統合
ほとんどのエディターがリアルタイムYAMLリンティングをサポートしています:
- VS Code:Red Hatの「YAML」拡張機能をインストール(yamllintを使用)
- Vim/Neovim:ALEまたはcoc-yamlを使用
- JetBrains IDE:設定可能なインスペクション付きの組み込みYAMLサポート
YAMLファイルの保存時フォーマットを有効にして、空白の問題を自動修正しましょう。
ツール固有のリンティング
汎用YAMLリンティングは構文エラーを検出しますが、ツール固有のリンターはセマンティックな正確性を検証します:
Kubernetes
# kubeval - K8sスキーマに対する検証
kubeval deployment.yaml
# kubeconform - より高速な代替
kubeconform -strict deployment.yaml
Docker Compose
docker compose config --quiet
GitHub Actions
# actionlint - ワークフロー構文を検証
actionlint .github/workflows/*.yml
Ansible
ansible-lint playbook.yml
YAML構文ルールの詳細については、YAML構文チュートリアルをご覧ください。
ベストプラクティスまとめ
- CIにyamllintを追加 — すべてのYAML変更はリンティングを通過すべき
- Pre-commitフックを使用 — リポジトリに到達する前にエラーを検出
- 2スペースインデントに標準化 — DevOpsの慣例
- truthyルールを無効にするか制限する —
yes/noの真偽値問題は実際のバグを引き起こす - 合理的な行の長さを設定 — 120文字でほとんどのケースをカバー
- ツール固有のバリデーターを使用 — 汎用リンティング + K8s/Docker/Actions固有の検証
- エディターを設定 — リアルタイムフィードバックはCIの失敗より速い
FAQ
設定ファイルにはYAMLとJSONのどちらを使うべきですか?
人間が編集する設定ファイルには、可読性、コメントサポート、簡潔な構文のためYAMLが好まれます。JSONは、マシン生成データやAPI通信に適しています。詳細な比較については、YAML vs JSONガイドをご覧ください。
yamllintの警告とエラーをどう扱うべきですか?
重要なルール(インデント、構文)はCIをブロックするエラーとして設定してください。スタイルルール(行の長さ、コメント)は表示されるがブロックしない警告として設定してください。これにより厳格さと開発者の生産性のバランスが取れます。
関連リソース
- YAMLバリデーター — YAMLの構文をオンラインで即座に検証
- YAML構文チュートリアル — ゼロからYAMLを学ぶ
- Docker ComposeのためのYAML — Docker固有のYAMLパターン