このブログを検索

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


ラベル Ansible の投稿を表示しています。 すべての投稿を表示
ラベル Ansible の投稿を表示しています。 すべての投稿を表示

2023年3月31日金曜日

やってみよう自動化ツール Ansible その6 動的PVCが使えるようにnfs-clientを自動で展開してみよう

今回は、Podに永久ストレージを自動で追加してくれる動的PVCを使えるように、nfs-clientの導入をやっていきます。
事前準備として、コントロールプレーンノード、ワーカーノードからNFSの領域がアクセスできるようにしておいてください。

NFS用意してないよっていう人は、以下の作業で検証用のNFSを適当に作ってください。
1. マウントする領域を作成する(mkdir /share/nfs)
2. yum install nfs-utils で nfs-utils をインストール
3. vi /etc/exports で通信設定を行う
/share/nfs NFSサーバーにアクセス可能にするネットワーク(rw,no_root_squash,async) 4. firewallを無効
5. サービスを起動する
systemctl start rpcbind systemctl start nfs
NFSを用意したら忘れずにWorkerノードにマウントしてください
1. マウントポイント作成(mkdir /share/nfs-client)
2. yum install nfs-utils で nfs-utils をインストール
3. mount -v -t nfs NFSのIPアドレス:/share/nfs /share/nfs-client
準備ができたら、次に進みましょう。
まず、手動でやる際のnfs-client導入手順確認です
1. nfs-clientをインストールするためにhelmを利用するので導入します

   curl -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
   bash ./get-helm-3

2. helmからnfs-clientをデプロイできるようにリポジトリを追加します

   helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

3. helmからnfs-clientをデプロイします

   helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
     --set nfs.server=NFSのIPアドレス \
     --set nfs.path=/share/nfs
手順としては上記で完了です。
これをもとにansible用のプレイブックを作成していきましょう。

まず、今回もrolesを使っていこうと思うので、roles/nfs_client/tasks/main.yaml を作成し以下の内容を記載します。
---
- name: helm get
  shell: curl -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

- name: helm install
  shell: bash ./get-helm-3

- name: helm add repo
  shell: helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

- name: nfs-client deploy
  shell: helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=NFSのIPアドレス --set nfs.path=/share/nfs
---
続いて前回作成したrolesを呼び出す用のプレイブック(k8s-add.yaml)に、このrolesを追加します。
- name: setup k8s
  hosts: kubectl
  remote_user: root

  tasks:
#    - name: metallb setup
#      include_role:
#        name: MetalLB

    - name: nfs-client setup
      include_role:
        name: nfs_client
前回作成済みのMetalLBがすでにあるので、MetalLBについての処理はコメントアウトしています。
あとは、ansibleからプレイブックを実行するだけです。

ansible-playbook k8s-add.yaml
正常に処理が行われたら、PVCが使えるか確認してみましょう。
まず、以下のコマンドで nfs-client を導入したことにより追加された storage class と pod を確認します。
kubectl get pod,sc
nfs-subdir-external-provisioner-xxxxx という pod と nfs-client というstorage class ができていると思います。
現時点では pvc も pv もないことを確認しておいてください。
kubectl get pv,pvc
No resources found
では、pvcを作成するyamlを作成します。
pvc.yaml
----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-provisioner
  annotations:
    volume.beta.kubernetes.io/storage-class: nfs-client
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
----
以下のコマンドでPVCを作成します。
kubectl apply -f pvc.yaml
pvc とそれに Bound された pv が作成されていることを確認してください。
# kubectl get pv,pvc
今回は以上となります。

2023年2月28日火曜日

やってみよう自動化ツール Ansible その5 タイプLBのSVCを使えるようにMetalLBを自動で展開してみよう

えー、残念ながらコントロールプレーンへワーカーの追加を自動で行うのはうまくいきませんでした。
できないときはすっぱりあきらめて次に進みましょう。
というわけで今回は、お手製k8sでは使えないLBの役割を満たしてくれるMetalLBの構築をやっていきましょう。

その前に、前回のままだとコントロールプレーンで以下のコマンドを実施し、接続用の情報を出力しましょう。
kubeadm token create --print-join-command
このコマンドの出力をワーカーで実行してクラスターへ追加します。

コントロールプレーンへワーカー追加後は、以下のコマンドでCNI(今回はflannnel)を追加しましょう。
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

ではMetalLBの作業を自動化するにあたってMetalLBのインストール作業を確認します。
作業する端末はansibleを実行するサーバに変更してください。

公式
https://metallb.universe.tf/installation/

手順的には、以下のコマンドでインストール
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml

IPアドレスのレンジ等を決めるには、以下のような構成ファイルをyamlで作成してこちらも apply する。
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertisement
  namespace: metallb-system
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ipaddresspool
  namespace: metallb-system
spec:
  addresses:
  - xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx ★環境に合わせてレンジを設定してください。
手順的にはこれだけなのでひとまとめにしてしまいたいですが、k8sを作ってはMetaLBを設定するという作業はあり得るのでこちらもrolesで呼び出せるようにしておきましょう。
※新環境を作る際にはIPアドレスのレンジを変更しておくことを忘れないでください。

と、いうわけなんですが、kubectlを実行するのはansibleを実行する端末ではありません。
コマンド自体は ansible を実行する際に shell を利用してコマンドを実行すればいいのですが、構成ファイルの方はコントロールプレーンへ送る必要があります。
kubectl を ansible実行端末で使えるようにするという手もありますが、今回のシリーズは ansible を使っていくことを目的としているのでなるべく ansible で頑張ろうと思います。

というわけで、手順的には以下の順になります。
構成ファイルは MetalLB_conf.yaml として作成し、ansible 実行時のカレントディレクトリに作成します。

1. ファイルをコントロールプレーンへ送る
2. 構成ファイルを apply する
3. MetalLB を apply する

roles/MetalLB/tasks/main.yaml への記述内容としては以下になります。
- name: Config File Copy
  copy:
    src: MetalLB_conf.yaml
    dest: /root/MetalLB_conf.yaml

- name: Config apply
  shell : kubectl apply -f /root/MetalLB_conf.yaml

- name: MetalLB apply
  shell : kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml

そしてこれを呼び出す k8s-add.yaml を以下のように作成します。

- name: k8s add
  hosts: kubectl
  remote_user: root

  tasks:
    - name: setup
      include_role:
        name: MetalLB
今回は単品となりますが、この yaml に今回のように必要に応じて追加する機能への処理を足していくことで、k8s 構築後の作業が楽になるはずです。
準備ができたら以下のコマンドで処理を実行してみましょう。

ansible-playbook k8s-add.yaml

エラーにならなければ問題なく成功していると思いますが、確認したい場合はLBタイプのServiceを適当に作成して『EXTERNAL-IP』からLBに与えた範囲からIPアドレスが払い出されているか確認してください。
次は nfs-client の構築を自動化したいと思います。

2023年1月13日金曜日

やってみよう自動化ツール Ansible その4 ワーカーノード作成を自動でつくってみる

あけましておめでとうございます。
今年も当ブログをよろしくお願いします。

今回は去年作ったコントロールプレーンに追加するワーカーノードを作成していこうと思います。
なお、今回は1つの yamlファイルに命令をすべて書くのではなく、処理を『OSのセットアップ』『Containerd のセットアップ』『ワーカー用セットアップ』3つに分けて呼び出したいと思います。
ansible-playbook コマンドで呼び出すファイルには『コレとコレとコレの処理を使います』と書く感じですね。

実際にはこんな感じになります。
worker_node.yaml
- name: setup worker node
  hosts: worker
  remote_user: root

  tasks:
    - name: setup os
      include_role:
        name: os-set

    - name: setup containerd
      include_role:
        name: containerd-set

    - name: setup worker
      include_role:
        name: worker-set

このように記述すると、rolesディレクトリ配下のディレクトリ『os-set』『containerd-set』『worker-set』にある『tasks』ディレクトリ内の『main.yaml』に書かれた処理を読み込んでくれます。
文章だとよくわからないので以下のような構造にする必要があるということになります。
├── worker_node.yaml
│ 
├── roles
│     ├── os-set
│     │     └── tasks
│     │            └── main.yaml
│     │ 
│     ├── containerd-set
│     │     └── tasks
│     │            └── main.yaml
│     │ 
│     └── worker-set
│            └── tasks
│                   └── main.yaml
では、それぞれの処理を見ていきましょう。
まずはOSのセットアップです。
SElinux停止やFWの停止をしています。
roles/os-set/tasks/main.yaml
  - 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
続いて、Containerd をインストールします。
  - name: Swap Stop swapoff
    shell : swapoff -a

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

  - 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
最後に、kubeadmin をインストールします。
roles/worker-set/tasks/main.yaml
  - name: kubernetes.repo create
    file:
      path: /etc/yum.repos.d/kubernetes.repo
      state: touch

  - name: add kubernetes.repo
    lineinfile:
      dest: /etc/yum.repos.d/kubernetes.repo
      line: "{{ item }}"
    with_items:
      - "[kubernetes]"
      - "name=Kubernetes"
      - "baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64"
      - "enabled=1"
      - "gpgcheck=1"
      - "repo_gpgcheck=1"
      - "gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg"

  - name: Install kubeadm
    yum:
      name: kubeadm
上記のファイルを正しく配置して準備はおしまいです。
あとは、ansible-playbook worker_node.yaml を実行すると自動で処理を行ってくれるはずです。

このあと、コントロールプレーンで kubeadm token create --print-join-command を実行し、ワーカーで kubeadm join を実行するのですがそこはちょっと手動でお願いします・・・ 実はそこまで試したんですが、token を表示させて register: するところまではうまくいったんですがそこからコマンドだけを引っ張り出すのがうまくいかなかったのでいったん保留としています。
うまくいったら次回はそこの自動化について書きたいと思います。

2022年12月23日金曜日

やってみよう自動化ツール Ansible その3 k8sのコントロールプレーンを自動化してみる

今回は、前回準備を整えた環境にAnsibleをつかってKubernetesを自動インストールしていこうと思います。
実行する内容としては、Kubernetesをインストールする際に使うkubeadmのyumリポジトリを追加、kubeadmのインストール、kubeadm int でコントロールプレーンの作成、kubectlコマンド実行のためのkubeconfig用設定となります。

用意するプレイブックは以下の内容となります。
- name: setup Containerd
  hosts: kubernetes
  remote_user: root

  tasks:
  - name: kubernetes.repo create
    file:
      path: /etc/yum.repos.d/kubernetes.repo
      state: touch

  - name: add kubernetes.repo
    lineinfile:
      dest: /etc/yum.repos.d/kubernetes.repo
      line: "{{ item }}"
    with_items:
      - "[kubernetes]"
      - "name=Kubernetes"
      - "baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64"
      - "enabled=1"
      - "gpgcheck=1"
      - "repo_gpgcheck=1"
      - "gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg"

  - name: Install kubeadm
    yum:
      name: kubeadm

  - name: Kubernetes Setup
    shell : kubeadm init --apiserver-advertise-address=172.20.73.91 --pod-network-cidr=10.244.0.0/16

  - name: $HOME/.kube create
    shell : mkdir -p $HOME/.kube

  - name: copy admin.conf
    shell : sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  - name: chown $HOME/.kube/config
    shell : sudo chown $(id -u):$(id -g) $HOME/.kube/config

task: 以降について解説します。
『kubernetes.repo create』これは、次のタスクで内容を記述していくためのファイル作成部分になります。
『add kubernetes.repo』これは、yum で kubeadm をインストールする際に必要なリポジトリの内容を追加しています。
『Install kubeadm』これは、yum で kubeadm をインストールしています。
『Kubernetes Setup』これは、kubeadm を使用して Kubernetes を構築しています。CNI は flannel を使用しています。
『$HOME/.kube create』『copy admin.conf』『chown $HOME/.kube/config』この3つは、Kubernetes へ対して操作を行う kubectl を使うための処理となっています。
kubectl は $HOME/.kube/config に書いてある接続に必要な情報を読み取って Kubernetes とやり取りをするため、ディレクトリを作って情報が記入されているファイルをコピーして権限を整えているという処理になります。

Kubernetes をよくご存じの方は --pod-network-cidr から flannel って… と思われる方もいるかもしれませんが、私が初めて Kubernetes を構築して Pod の通信についてあれやこれやと頭を悩ませ、VXLAN やカプセル化といった仕組みを理解するまで一緒に付き合ってくれた思い入れのある機能なので使いたくなってちゃうんですよねw
どうかご容赦ください。

この後は、コントロールプレーンに追加する用のワーカーの作成になります。
こちらについては、今まで作成した OS の設定、Containerd の構築、Kubernetes の構築、これらの処理を roles を利用して呼び出す形で作成したいともいます。

今年もブログを読んでいただきありがとうございました。
来年もよろしくお願いします。

よいおとしを~

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月のブログ投稿になるかもしれません。

2022年10月31日月曜日

やってみよう自動化ツール Ansible その1 Ansible ってどんなもの? インストールはどうやるの?

今回から、自動化ツールの Ansible を使用して今まで手動で作ったものを自動で作ってみるシリーズを開始したいと思います。
どんなことをやるかといいますと、K8s を Ansible で自動構築してそこに MetalLB なんか立ててみたいな~ って思っています。

今回は、まず Ansible ってどういうものなのかと、どうやって使うかの説明を行います。
ドキュメントは以下となっています。


https://docs.ansible.com/ansible/2.9_ja/index.html

Ansible は Ansible をインストールしたマシンから、作業を行いたいマシンへ ssh で接続します。
どうやって作業を行うかというと、playbook という作業内容を書いた yml 形式のファイルを用意します。
この yml ファイルを指定することで、作業を行ってもらうわけです。

ansibleの設定ファイルなどは、インストールしたホストの「/etc/ansible」に置かれます。
ls コマンドで確認してみると設定ファイルの ansible.cfg とアクセスするホストの情報を記入する hosts 個別に処理を用意して呼び出せるようにする role 用のディレクトリがあります。

全ての作業を一つの yml に書いて作業を行うことも可能ですが、いろんなサーバーを構築する場合でも同じ処理というものは発生すると思います。
ホスト名の設定や必ずインストールする必要があるものなどです。
そういう場合に処理をあらかじめ書いておいて必要な処理だけを呼び出してつかえるのが「roles」になります。

全体の処理をスタートさせる yml があって、その中にどの「roles」を呼び出すかという処理を書きます。
「role」ディレクトリ配下に作成したディレクトリ名がyamlで呼び出すときに指定するの名前となり、そのディレクトリに行いたい処理を記載した yml を配置する形になります。
例として、ホスト名設定、必要パッケージのインストール、という処理を roles を使用した際のファイル配置は絵でかくとこんなイメージです。

全体処理のyml
 |
 |― 「roles」←ディレクトリ
     |
     |―「OS_Setup」←ディレクトリ
     |   |
     |   |―「tasks」←ディレクトリ
     |   |     |    
     |   |     |― main.yml(ホスト名設定の処理を書いた yml )
       |
       |
     |―「Package_Insutall」←ディレクトリ
         |
         |―「tasks」←ディレクトリ
                 |         
                |― main.yml(必要パッケージのインストール処理を書いた yml )


「main.yml」となっているのは、各ディレクトリの「main.yml」を読み込むように設定されているためです。
全体の yml にはどのロールを使うのかの指定を行うフィールドを書いて「OS_Setup」や「Package_Insutall」のディレクトリ部分を指定します。
※本当は「tasks」と同列に「handlers」と「templates」というディレクトリも行わせる処理によって用意します。

とまぁ、複雑なこともできるようになっているので Ansible は使えるようになっておいて損はないと思います。
構築だけでなく繰り返し同じ処理を行うようなテストでも使えそうですからね。

とはいえすぐにいろいろ機能を使ったものを作るのも理解するのも無理なので、まずは基本となる1つの yml に全部を書く形でやってみましょう。
最後はそれを元に roles に分解していきたいと思います。

では、Ansible のインストールをしてみましょう。
ホストOSはCentos 7 を使います。
公式マニュアルはこちら
https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html

yum でサクッとインストールするのですが、リポジトリが epel の様なのでそちらをインストールします

# yum install epel-release

リポジトリが使えるようになったので Ansible をインストールしましょう

# yum install ansible

インストール自体はこれで完了です。
確認として ansible のバージョンを表示してみましょう
# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]


このように出力されていれば成功です。
次回は、Docker と同様にコンテナを動かすことができる containerd のインストールを ansible で行う playbook の作成をやってみようと思います。