はじめに
IBM Concert周辺技術・OSの理解をこの夏休みの宿題にしました。
まずは、YAMLファイルについて学び直します。
この記事では「YAMLとは何か」を整理し、Ansible・Docker Compose・Kubernetesの3つのDevOpsツールのYAMLファイルを読んでいきます。
対象読者: インフラ・DevOpsに入門し始めた若手エンジニア
YAMLとは
YAML(YAML Ain't Markup Language)は、設定ファイルを書くための人間に読みやすいデータ形式です。
| 特徴 | 説明 |
|---|---|
| インデントで構造を表現 | タブではなくスペースを使う |
key: value 形式 |
シンプルなマッピング記法 |
- でリスト表現 |
箇条書き感覚でリストを書ける |
# でコメント |
コードと同じようにコメントが書ける |
Ansible の YAML(ansible.yaml)
Ansible はサーバー構成の自動化ツールです。YAMLでタスクの手順書(Playbook)を書きます。
「どのサーバー(hosts)で、どんなタスク(tasks)を実行させようとしているか」という視点で読みます。
- name: Setup nginx server on myserver list (host group)
hosts:
- devservers # 対象サーバーグループを指定
become: true # sudo 権限で実行
tasks:
- name: Install the latest version of nginx
command: amazon-linux-extras install nginx1 -y
- name: Ansible copy file to remote server
copy:
content: | # ファイルの内容をここに直接書ける
<h1>Hello</h1>
dest: /usr/share/nginx/html/index.html
読み方のポイント
-
hosts→ どのサーバーに対して実行するかを指定 -
become: true→ root権限への切り替え(sudo相当) -
tasks→ 実行する処理を上から順に並べる -
copyモジュールのcontent→|(リテラルブロック)で複数行テキストをそのまま書ける
Docker Compose の YAML(docker-compose.yaml)
Docker Compose は複数コンテナをまとめて管理するツールです。YAMLでサービス(コンテナ)の構成を定義します。
「どのようなdockerファイルのbuildを行なっているのか」という視点で読みます。
services:
frontend:
image: awesome/webapp # 使用するイメージ名
build: ./webapp # Dockerfileの場所(パス指定)
backend:
image: awesome/database
build:
context: backend # ビルドコンテキストのディレクトリ
dockerfile: ../backend.Dockerfile # Dockerfileを個別に指定
custom:
build: ~/custom # ホームディレクトリ以下を指定することもできる
読み方のポイント
-
services→ コンテナ群の定義ブロック。各キーがサービス名になる -
image→ ビルド後のイメージに付ける名前 -
build→ ビルドに使うDockerfileの場所を指定- 文字列で書けば単純なパス指定
- マッピングで書けば
contextとdockerfileを別々に指定できる
Kubernetes の YAML(kubernetes.yaml)
Kubernetes はコンテナのオーケストレーションツールです。YAMLでクラスター上のリソースを定義します。
「何のサービスで、通信がどう流れるか」という視点で読みます。
apiVersion: v1 # APIのバージョン
kind: Service # リソースの種類(他にも、DeploymentやPodがある)
metadata:
name: my-service # リソース名
spec:
selector:
app.kubernetes.io/name: MyApp # 転送先のPodをラベルで指定
ports:
- protocol: TCP
port: 80 # Serviceが受け付けるポート(外部向け)
targetPort: 9376 # 転送先PodのポートPort
externalIPs:
- 80.11.12.10 # 外部からアクセスできるIPアドレス
通信の流れ
[外部クライアント]
│ アクセス (80.11.12.10:80)
▼
[Service: my-service]
│ selector で MyApp ラベルの Pod を特定
│ ポート 80 → targetPort 9376 へ変換
▼
[Pod (MyApp)] ポート 9376 で待受
読み方のポイント
-
4つの必須キー:
apiVersion/kind/metadata/specはほぼすべてのリソースで共通 -
selector→ ラベルで転送先のPodを動的に特定する仕組み -
portとtargetPortの違い → 外から見えるポートとPod内部のポートは別物
おわりに
YAMLを読む際は、まずどのツールかとその役割を意識すると理解しやすくなります。
まずはインデントで構造を捉えて、細部を見ていく。
| ツール | YAMLの役割 |
|---|---|
| Ansible | サーバー構成の手順書(Playbook) |
| Docker Compose | コンテナ群の起動設定 |
| Kubernetes | クラスター上のリソース定義 |