0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人メモ】DevOps基礎としてのYAMLファイル

0
Posted at

はじめに

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の場所を指定
    • 文字列で書けば単純なパス指定
    • マッピングで書けば contextdockerfile を別々に指定できる

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を動的に特定する仕組み
  • porttargetPort の違い → 外から見えるポートとPod内部のポートは別物

おわりに

YAMLを読む際は、まずどのツールかとその役割を意識すると理解しやすくなります。
まずはインデントで構造を捉えて、細部を見ていく。

ツール YAMLの役割
Ansible サーバー構成の手順書(Playbook)
Docker Compose コンテナ群の起動設定
Kubernetes クラスター上のリソース定義
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?