このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2022年11月30日水曜日

やってみよう自動化ツール Ansible その2

今回は、実際に Ansible のプレイブックを作成して自動でいろいろファイルに書き込んだり、パッケージのインストールやサービスの設定をやってみましょう。
具体的には、Docker と同じくコンテナの管理ができる Containerd のインストールを行うための各設定をおこない、インストールしてサービスの起動を行ってみます。

私が以前書いた記事を読んだことがある方は、せっかく前いろいろやったのに Docker 使わないの? と思われるかもしれません。
ちょっとした理由がありまして・・・

この環境を使って次回以降に Kubernetes(以降 k8s) を作成していこうと思ったのですが、k8s が Docker で構築できなくなりました。
K8s は Docker からコンテナを管理する部分の機能を使わせてもらいたくて Dockershim というモジュールを用意していたのですが、k8s がそれを使うのをやめることにしたためです。
昔は Docker しかなかったんですが、現在は Docker と同様にコンテナを管理する機能を提供してくれるCRIランタイム(Containerd 等)があります。
そちらを使ったほうが無駄が省けるという事のようです。(開発する部品が少なくなるほうが開発側も楽でしょうしね)

それでは、実際にどんなプレイブックを用意するのかこちらをご覧ください。
これは、ザーッっと流してみてください。
のちほど分解して説明します。(もしかしたら、コマンドとかからなんとなく処理がわかるかもしれませんが・・・)

Containerd のための設定の他に、k8s 用の設定変更も一部入っています。
参考情報:
https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#containerd
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

ファイル名:containerd-set.yaml
- name: setup Containerd
  hosts: continard
  remote_user: root

  tasks:
  - name: Swap Stop
    shell : swapoff -a
    shell : sed -i '/centos-swap/s/^/# /g' /etc/fstab

  - name: SElinux Disable
    ansible.posix.selinux: state=disabled
    become: true

  - name: Reboot
    ansible.builtin.reboot: reboot_timeout=600
    become: true

  - name: FW Stop
    service:
      name: firewalld
      state: stopped
      enabled: no

  - name: kernel module file create
    file:
      path: /etc/modules-load.d/containerd.conf
      state: touch

  - name: kernel module file add line
    lineinfile:
      dest: /etc/modules-load.d/containerd.conf
      line: "{{ item }}"
    with_items:
      - "overlay"
      - "br_netfilter"

  - name: kernel module Load
    shell : modprobe overlay
    shell : modprobe br_netfilter

  - name: kernel parameter file create
    file:
      path: /etc/sysctl.d/99-kubernetes-cri.conf
      state: touch

  - name: kernel parameter file add line
    lineinfile:
      dest: /etc/sysctl.d/99-kubernetes-cri.conf
      line: "{{ item }}"
    with_items:
      - "net.bridge.bridge-nf-call-iptables  = 1"
      - "net.ipv4.ip_forward                 = 1"
      - "net.bridge.bridge-nf-call-ip6tables = 1"

  - name: System Reload
    shell : sysctl --system

  - name: Package Install
    yum:
      name: yum-utils
      name: device-mapper-persistent-data
      name: lvm2

  - name: containerd add repository
    shell : yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  - name: Containerd Install
    yum:
      name: containerd.io

  - name: containerd Setting folder create
    file:
      path: "/etc/containerd"
      state: directory

  - name: containerd Setting file create
    shell : containerd config default | sudo tee /etc/containerd/config.toml

  - name: containerd Restart
    service:
      name: containerd
      state: restarted
      enabled: no
やってることは、サービスの起動と停止、設定ファイルの作成と内容の追記、yumのリポジトリ追加とパッケージのインストールなどです。
書き方なんですが、YAML形式となっていてインデントなどの位置が重要ですので自分で作成するときはご注意ください。
内容が長く読むのが大変だと思いますが、中身の解説に入りたいと思います。
- name: setup Containerd
  hosts: continard
  remote_user: root
この部分は処理を行わせる対象の指定と処理を行うユーザーの指定となります。
『name: 』プレイブックの名前を設定しています。
『hosts: 』で inventry ファイルに記載したどのホストを対象にするのかを指定しています。
『remote_user: 』対象にアクセスしに行く際のユーザーを指定しています。

『tasks:』以降からが実際に行ってもらう作業の内容になります。
『- name: 』で各処理に名前を付けています。 どこでエラーになったのかなどを確認する際に重要になるので重複する名前は避けたほうがいいです。
  tasks:
  - name: Swap Stop
    shell : swapoff -a
    shell : sed -i '/centos-swap/s/^/# /g' /etc/fstab
k8s の要件でスワップを停止しています。
  - name: SElinux Disable
    ansible.posix.selinux: state=disabled
    become: true

  - name: Reboot
    ansible.builtin.reboot: reboot_timeout=600
    become: true
余計なことをされると困るので、SElinux を停止します。
『ansible.posix.selinux:』モジュールを使って、設定を変更しています。
disabledにするには再起動が必要(しないと permissive)なので『ansible.builtin.reboot:』を入れています。
  - name: FW Stop
    service:
      name: firewalld
      state: stopped
      enabled: no
『service:』モジュールを使ってファイアウォールを止めています。
本来は K8s の必要ポートを開放するのですが検証環境なのでこうしました。
  - name: kernel module file create
    file:
      path: /etc/modules-load.d/containerd.conf
      state: touch

  - name: kernel module file add line
    lineinfile:
      dest: /etc/modules-load.d/containerd.conf
      line: "{{ item }}"
    with_items:
      - "overlay"
      - "br_netfilter"

  - name: kernel module Load
    shell : modprobe overlay
    shell : modprobe br_netfilter
『file:』モジュールを使って、/etc/modules-load.d/containerd.conf を作成
『lineinfile:』モジュールを使って、作成したファイルに "overlay" と "br_netfilter" を追記しています。
『shell :』モジュールを使って、modprobe を実行し読み込んでいます。
  - name: kernel parameter file create
    file:
      path: /etc/sysctl.d/99-kubernetes-cri.conf
      state: touch

  - name: kernel parameter file add line
    lineinfile:
      dest: /etc/sysctl.d/99-kubernetes-cri.conf
      line: "{{ item }}"
    with_items:
      - "net.bridge.bridge-nf-call-iptables  = 1"
      - "net.ipv4.ip_forward                 = 1"
      - "net.bridge.bridge-nf-call-ip6tables = 1"

  - name: System Reload
    shell : sysctl --system
こちらも同様に『file:』でファイルを作成し、『lineinfile:』で追記をして、『shell :』で読み込むコマンドを実行しています。
  - name: Package Install
    yum:
      name: yum-utils
      name: device-mapper-persistent-data
      name: lvm2
『yum:』モジュールを使って、必要なパッケージのインストールをしています。
  - name: containerd add repository
    shell : yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Containerd をインストールするためのリポジトリを追加しています。
お気づきかもしれませんが Docker を入れるときのリポジトリと同じです。
実はContainerd も Docker社が作ってたものなのです。
  - name: Containerd Install
    yum:
      name: containerd.io

  - name: containerd Setting folder create
    file:
      path: "/etc/containerd"
      state: directory

  - name: containerd Setting file create
    shell : containerd config default | sudo tee /etc/containerd/config.toml

  - name: containerd Restart
    service:
      name: containerd
      state: restarted
      enabled: no
Containerd をインストールして、設定を入れるためのファイルを作成し、内容を追記してサービスを起動しています。

というわけで内容の説明はここまでです。
本当は設定変更後に、その設定を確認するコマンドを打って『register:』に格納して『debug:』で表示するとかも入れようかと思ったんですが、さすがに長くなりすぎるので次回以降で説明するタイミングがあったら入れたいと思います。

プレイブックの他に、ホストの情報を記入する hosts ファイルも修正しなければなりません。
「/etc/ansible」配下の hosts に以下のような内容を追記します。
xxx.xxx.xxx.xxx には Ansible からアクセスを行う対象のIPアドレスを入れてください。
[continard]
demo-server   ansible_host=xxx.xxx.xxx.xxx
実際に、実行してみましょう。
以下のコマンドで実行できます。
# ansible-playbook containerd-set.yaml
・・・どうでしょうか。
人によってはエラーになると思います。
というのもですね、sshでアクセスしますのでそのサーバーに初回アクセスする状態だと認証ではじかれちゃうんですよね。

というわけで、そうなっちゃった方は以下のコマンドでsshの鍵を渡してあげましょう。
xxx.xxx.xxx.xxx には Ansible からアクセスを行う対象のIPアドレスを入れてください。
# ssh-copy-id root@xxx.xxx.xxx.xxx
その後改めて実行してみてください。
そもそものプレイブックの書き方でエラーになってしまう場合は、インデントのズレなどがないか確認してみてください。

うまく処理ができた方は、Containerd をインストールしたマシンにログインして以下のコマンドを実行してください。
バージョン情報が確認できると思います。
# ctr -v
ctr containerd.io 1.6.9
これで kubernetes の構築を行う準備が整った状態となりました。 次回のブログ(来月)はいよいよ kubernetesK8s の構築を Ansible で行っていきたいと思います。 ただ、年末なのでいろいろ忙しく確認の時間が取れなかったりしたら1月のブログ投稿になるかもしれません。