⚙️

WSL2上で Ansible を使った STNS-Client のインストール方法

2024/02/07に公開

本記事はQiitaから移転したものです。

とある業務で触れるきっかけがあったので投稿します.
Asinble を使って STNS-Client をインストールする方法を説明していきます.

そもそもAnsibleとは?

一言で言えば「インフラ構築自動化ツール」です.
近年,構築・運用するシステムの規模が増大してきている中で,手動オペレーションによるヒューマンエラーや作業工数を削減することができます.また,冪等性が担保されているので,すべての管理対象で同じ結果を得ることができます.
構成管理ツールは他にもPuppet,Chefがありますが,Ansibleが人気なのはYAMLで記述できるため,学習コストが低いことが挙げられると思います.

実行環境

Ansibleホスト

  • WSL (Ubuntu 20.04.5 LTS)
  • asinble 6.4.0 (2022/10/11 現在)
  • asinble-core 2.13.4 (2022/10/11 現在)

適用対象

  • Ubuntu 20.04 の VM7台

1. Asinble のインストール

1-1. パッケージのインストール

Asinble を pip 経由でインストールします.

$ pip install --user ansible

Python環境の関係で特定のバージョンのインストールを行いたい場合は,下の例の通りにバージョンを明示的に指定することで可能です.
バージョンは ansible-build-data - GitHub から随時確認してください.

$ pip install --user ansible==6.4.0

1-2. Path を通す

インストール後,ansible --version を実行して Command 'ansible' not found, but can be installed with: sudo apt install ansible などと言われる場合は,パスを通します.

~/.bashrc を開き,下のように追記します.

~/.bashrc
export PATH="~/.local/bin:$PATH"

その後,正常にバージョン表示がされることを確認します.

$ ansible --version
ansible [core 2.13.4]
  config file = None
  configured module search path = ['/home/<User>/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/<User>/.local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/<User>/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/<User>/.local/bin/ansible
  python version = 3.8.10 (default, Jun 22 2022, 20:18:18) [GCC 9.4.0]
  jinja version = 3.1.2
  libyaml = True

2. Ansible の設定

pip 版でのインストールのため,ansible.cfg を下記のコマンドを生成します.
--disabled オプションをつけることで,コメントアウトされた状態の設定ファイルを生成することができます.

$ ansible-config init --disabled > ansible.cfg

ansible-config を実行することで,設定ファイルのパスが設定されます.
今回は特に設定せず,デフォルトでいきます.

$ ansible --version
ansible [core 2.13.4]
  config file = /home/<User>/ansible.cfg
  ︙

3. playbookの作成

自動化したい操作を記述していきます.
今回はSTNSサーバの設定は既に完了しており,予めSTNSクライアントの設定ファイルは準備できているものとしました.
その他,各種ファイルのバックアップやサービス再起動も記述してあります.

stns-install.yaml
- hosts: all
  tasks:
    - name: Get installer
      ansible.builtin.uri:
        url: https://repo.stns.jp/scripts/apt-repo.sh
        return_content: true
      register: stns_installer

    - name: Run installer
      become: true
      ansible.builtin.shell:
        cmd: "{{ stns_installer.content }}"
      when: not ansible_check_mode

    - name: Apt install
      become: true
      ansible.builtin.apt:
        pkg:
          - stns-v2
          - libnss-stns-v2
          - cache-stnsd
      ignore_errors: "{{ ansible_check_mode }}"

    - name: Backup /etc/stns/client/stns.conf
      become: true
      ansible.builtin.copy:
        src: /etc/stns/client/stns.conf
        dest: /etc/stns/client/stns.conf.bak
        owner: root
        group: root
        mode: 0644
        remote_src: true

    - name: Copy stns.conf
      become: true
      ansible.builtin.copy:
        src: config/stns.conf
        dest: /etc/stns/client/stns.conf
        owner: root
        group: root
        mode: 0644

    - name: "Restart & Enabled service cache-stnsd"
      become: true
      ansible.builtin.service:
        name: cache-stnsd
        state: restarted
        enabled: true

    - name: Backup /etc/nsswitch.conf
      become: true
      ansible.builtin.copy:
        src: /etc/nsswitch.conf
        dest: /etc/nsswitch.conf.bak
        owner: root
        group: root
        mode: 0644
        remote_src: true

    - name: Copy nsswitch.conf
      become: true
      ansible.builtin.copy:
        src: config/nsswitch.conf
        dest: /etc/nsswitch.conf
        owner: root
        group: root
        mode: 0644

    - name: Backup /etc/ssh/sshd_config
      become: true
      ansible.builtin.copy:
        src: /etc/ssh/sshd_config
        dest: /etc/ssh/sshd_config.bak
        owner: root
        group: root
        mode: 0644
        remote_src: true

    - name: Copy sshd_config
      become: true
      ansible.builtin.copy:
        src: config/sshd_config
        dest: /etc/ssh/sshd_config
        owner: root
        group: root
        mode: 0644

    - name: Restart service sshd
      become: true
      ansible.builtin.service:
        name: sshd
        state: restarted

4. インベントリファイル(管理先ホストを記述したファイル)の作成

操作したいマシンのホスト名または IP アドレスを記述したファイルを作成します.

[stns]
<実行するサーバのホスト名またはIP>

5. playbook を実行

いよいよ実行に移ります.

5-1. 文法のチェックを行う

$ ansible-playbook -i hosts ./stns-install.yaml --syntax-check
[Tips] SSH鍵認証ではなく,パスワード認証で実行する場合は以下のようにオプションを付加して実行します.
$ ansible-playbook --ask-pass -K -i hosts ./stns-install.yaml --syntax-check

5-2. DryRun を行う

$ ansible-playbook -i hosts ./stns-install.yaml --check

5-3. 本番実行

$ ansible-playbook -i hosts ./stns-install.yaml

6. 冪等性のチェック

すでに playbook を実行済みなので,何も行われないことを確認します.

$ ansible-playbook -i hosts ./stns-install.yaml

Ansible-Lint を使った playbook の品質向上

playbook は人によって書き方が異なることもあり,可読性が低くなることがあります.
ansible-lintは playbook の品質を向上させるためのツールです.
playbook の書き方が一定のルールに沿っていない場合は,指摘されるのでその通り修正すると良いです.

$ ansible-lint stns-install.yaml

参考サイト・記事

この場をお借りして感謝申し上げます.

https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

https://ansible-lint.readthedocs.io/

https://www.ashisuto.co.jp/product/category/system-management/ansible/

https://www.macnica.co.jp/business/semiconductor/articles/basic/136304/#:~:text=Ansibleとは簡単に,せることが可能です。

https://nwengblog.com/ansible-2-10/

https://note.com/shift_tech/n/na6d914a9367b

Discussion