2022年7月16日土曜日

AnsibleコントロールノードをAlmaLinux上に構築する

Ansibleは以前からきちんと使えるようになりたいと思いつつ、業務が多忙だったことや、他に優先して勉強することがあるなどで、きちんと習得できていなかった。

ただ、いくら業務で使っていないからといって、いつまでもAnsibleを避けていては、従来のインフラの構築手法や知識からの発展が見込めないため、ようやく腰を据えてAnsibleを勉強しなおすことにした。

具体的には、自宅の検証環境にAnsibleコントロールノードを構築し、Linuxサーバ、Windowsサーバ、VMware仮想環境などの構成管理をAnsibleにて実現したいと考えている。

実現結果は本ブログで記事として順次公開していきたい。以下、今後記事として公開したい内容となる。

まず第一弾として、本記事ではAnsibleコントロールノードをAlmaLinux上に構築する手順を記載する。

環境

コントロールノードとなるOSは、AlmaLinuxを用いる。ただし、Red Hat系のディストリビューションであるCentOSやRocky Linuxなどでも同様の手順で構築できるだろう。

  • OS : AlmaLinux 8.5
  • Ansible : ansible [core 2.13.1]

前提として、SELinuxとfirewalldは停止しておく。

# systemctl stop firewalld
# systemctl disable firewalld
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# reboot

Ansibleコントロールノード構築手順

1. dnfでpipをインストール

Ansibleはdnfで直接パッケージをインストールせず、Python用のパッケージ管理ツールである「pip」を用いる。pip自体はdnfでインストールできる。

また、AnsibleからLinuxに接続する際にSSH公開鍵認証方式ではなく、パスワード認証による接続をできるようにするため、sshpassのインストールも併せて行う。

# dnf install epel-release python3-pip sshpass -y

2. Python3をバージョンアップ

最新版のAnsibleを利用する場合、Pythonも新しいバージョンを使用する必要がある。例えば、最近のバージョンでは以下のバージョン制約がある。

Ansible Python
2.10以降 3.8以降
2.9 3.5以降

AlmaLinuxの場合、パッケージインストールされるバージョンは以下の通りとなる。

# python3 --version
Python 3.6.8

バージョンを最新化するため、dnfを用いてpython38をインストールする。

# dnf install python38 -y

通常利用するPythonをPython 3.6から3.8に変更するため、alternativesを使って、以下の通り設定する。

# alternatives --list
libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
python                  auto    /usr/libexec/no-python
ifup                    auto    /usr/libexec/nm-ifup
cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
python3                 auto    /usr/bin/python3.6
# alternatives --set python3 /usr/bin/python3.8
# alternatives --list
libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
python                  auto    /usr/libexec/no-python
ifup                    auto    /usr/libexec/nm-ifup
cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
python3                 manual  /usr/bin/python3.8

3. pipをバージョンアップ

Ansibleインストール前に、pip自体をバージョンアップする。

# pip3 install --upgrade pip
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting pip
  Downloading https://files.pythonhosted.org/packages/96/2f/caec18213f6a67852f6997fb0673ae08d2e93d1b81573edb93ba4ef06970/pip-22.1.2-py3-none-any.whl (2.1MB)
     |????????????????????????????????| 2.2MB 14.1MB/s
Installing collected packages: pip
Successfully installed pip-22.1.2

4. Ansibleをインストール

pipにてAnsibleをインストールする。なお、特にバージョン指定を行わない限り、最新バージョンのAnsibleが導入される。

# pip3 install ansible
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Collecting ansible
  Downloading ansible-6.0.0-py3-none-any.whl (40.3 MB)
     qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 40.3/40.3 MB 32.1 MB/s eta 0:00:00
Collecting ansible-core~=2.13.0
  Downloading ansible_core-2.13.1-py3-none-any.whl (2.1 MB)
     qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 2.1/2.1 MB 33.7 MB/s eta 0:00:00

~(中略)~

Installing collected packages: resolvelib, PyYAML, pyparsing, pycparser, MarkupSafe, packaging, jinja2, cffi, cryptography, ansible-core, ansible
Successfully installed MarkupSafe-2.1.1 PyYAML-6.0 ansible-6.0.0 ansible-core-2.13.1 cffi-1.15.1 cryptography-37.0.2 jinja2-3.1.2 packaging-21.3 pycparser-2.21 pyparsing-3.0.9 resolvelib-0.8.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

インストールされたAnsibleのバージョンは以下の通り。2.13.1という最新バージョン (2022年7月時点) が導入されている。

# ansible --version
ansible [core 2.13.1]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.12 (default, Apr 21 2022, 07:55:08) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)]
  jinja version = 3.1.2
  libyaml = True

なお、何らかの理由で古いバージョンのAnsibleを使用したい場合は、以下の通りバージョン指定を行うことでインストールできる。以下はバージョン2.9をインストールする場合の例となる。

# pip3 install "ansible==2.9.*"
# ansible --version
ansible 2.9.27
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.12 (default, Apr 21 2022, 07:55:08) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)]

以上で、Ansibleコントロールノードとして必要な作業は完了となる。次は、実際にAnsibleにて接続確認まで実施してみよう。

自身のOSに対してAnsibleによる接続確認

1. Ansible実行ユーザを作成

Ansible実行のユーザを作成する。今回はansibleuserという名前で作成した。Ansible実行ユーザは、SSHで接続できるようパスワード設定を行い、特権が必要な処理を実行するためにsudoできるよう、/etc/sudoersに設定を行う。

# useradd -u 2001 ansibleuser
# echo 'ansibleuser:[任意のパスワードを設定]' | chpasswd
# echo 'ansibleuser ALL=(root) NOPASSWD:ALL' >> /etc/sudoers

2. インベントリファイルの作成

Ansible実行時はインベントリファイルという、実行対象のサーバや接続ユーザ情報などを記載したファイルを指定したうえで実行する。今回は、hostsという名前で以下のようにインベントリファイルを作成した。

# vi hosts
[ansible_server]
192.168.11.25

[ansible_server:vars]
ansible_user=ansibleuser

3. Ansibleによる接続確認

Ansibleの接続確認を行うためのモジュールであるpingモジュールを使用して確認を行う。実行時のオプションの意味は以下の通りとなる。

オプション 説明
-i インベントリファイルを指定。
-m 実行モジュールを指定。
--ask-pass, -k 接続時にパスワード認証を用いる。
# ansible -i hosts -m ping 192.168.11.25 --ask-pass
SSH password: 
192.168.11.25 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

実行結果でpongと帰ってきていれば、Ansible実行に成功している。以上で、Ansibleコントロールノードの構築と接続確認は完了となる。

参考

なお、Ansibleの各種モジュールの使用方法は以下書籍が非常に詳しく参考になる。

0 件のコメント:

コメントを投稿

人気の投稿