【Ansible】CentOSのISOファイルからパッケージをオフラインインストール

はじめに

インターネットから遮断された閉域環境でLinuxサーバにパッケージをインストールする場合、インターネット上に公開されているリポジトリの代わりにOSのインストールメディアを使用することがあります。
今回は、AnsibleとCentOSのISOファイルを使用して、同様の作業を自動化してみたいと思います。
Ansibleによるリモート接続で使用するのはSSHのみなので、既に構築済みの既存システムに対しても比較的簡単に導入できる仕組みとなっています。

前提条件

コントローラノード(Ansibleを動かすサーバ)とターゲットノード(設定対象のサーバ)は、以下の記事を元にセットアップしています。

Ansibleのインストール (RHEL 8 / CentOS 8)
Ansible管理対象サーバの設定

CentOSのISOファイルは、公式サイトのミラーリポジトリからCentOS 8.2 (2004)のインストールDVDイメージを入手して使用します。
https://www.centos.org/centos-linux/

ディレクトリ構成

コントローラノード上のディレクトリ構成は以下の通りです。
sample-playbookというディレクトリを作成し、CentOSのISOファイル(CentOS-8.2.2004-x86_64-dvd1.iso)、インベントリ(hosts)、Playbook(install-packages.yml)の3ファイルを配置しています。

sample-playbook/
├── CentOS-8.2.2004-x86_64-dvd1.iso
├── hosts
└── install-packages.yml

本来コードの保守性を高めるためには、ミドルウェアごとにロールを作成すべきですが、今回は簡易的にパッケージインストールを試すだけなので、Playbook本体に変数とタスクの定義をまとめています。

ファイルの内容

hosts

インベントリの内容は以下の通りです。

  • サーバ名: server01
  • IPアドレス: 192.168.1.10
  • ログインユーザ: ansible
  • sudoパスワード: ansible
server01 ansible_host=192.168.1.10

[all:vars]
ansible_user=ansible
ansible_become_pass=ansible

install-packages.yml

Playbookの内容は以下の通りです。
コントローラノードからターゲットノードにISOファイルを転送し、ローカルでマウントしたディレクトリをYumリポジトリとしてパッケージのインストールを行います。

- hosts: server01
  become: yes

  vars:
    centos_iso: "CentOS-8.2.2004-x86_64-dvd1.iso"
    packages:
      - "httpd"
      - "php"
      - "mysql-server"

  tasks:
  - name: "Transfer ISO"
    copy:
      src: "{{ centos_iso }}"
      dest: "/tmp/{{ centos_iso }}"

  - name: "Create mount target directory"
    file:
      path: "/media/CentOS"
      state: "directory"
      owner: "root"
      group: "root"
      mode: "0555"

  - name: "Mount ISO"
    mount:
      path: "/media/CentOS"
      src: "/tmp/{{ centos_iso }}"
      fstype: iso9660
      opts: ro,noauto
      state: mounted

  - name: "Install packages"
    yum:
      name: "{{ packages }}"
      disablerepo: "\\*"
      enablerepo: "c8-media-BaseOS,c8-media-AppStream"
      state: present

  - name: "Unmount ISO"
    mount:
      path: "/media/CentOS/"
      src: "/tmp/{{ centos_iso }}"
      fstype: iso9660
      opts: ro,noauto
      state: absent

本Playbookのミソとなるのは、Install packagesタスクです。

CentOSは、/etc/yum.repos.d/CentOS-Media.repoに無効化状態でインストールメディア用のリポジトリ設定がデフォルトで用意されています。
同設定ファイル中、c8-media-baseOSc8-media-AppStreamの名前が付けられたリポジトリが存在し、それぞれ/media/CentOS/BaseOS/media/CentOS/AppStreamをYumリポジトリとして認識します。

Install packagesタスクでは、yumモジュールのアーギュメントにdisablerepoenablerepoを指定して、デフォルトで有効なリポジトリを全て無効化し、CentOSのインストールメディア用リポジトリのみ有効状態にしています。
この状態で、packages変数に格納されているパッケージ群をインストールすることで、マウントしたISOファイルからパッケージをオフラインインストールできます。

動作確認

コントローラノードでPlaybookを実行します。各タスクで変更が発生したので、changedがカウントされています。

$ ansible-playbook -i hosts install-packages.yml
(略)
PLAY RECAP ****************************************************************************************
server01                   : ok=6    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

もう一実行してみます。ISOファイルのマウント、アンマウントでchangedが発生しますが、その他の部分は冪等性が保たれているためカウントは2となります。

$ ansible-playbook -i hosts install-packages.yml
(略)
PLAY RECAP ****************************************************************************************
server01                   : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ターゲットノードにログインしてパッケージのインストール状態を確認すると、CentOSのインストールメディア用リポジトリ(@c8-media-AppStream)からパッケージがインストールされていることがわかります。

# yum list installed httpd php mysql-server
インストール済みパッケージ
httpd.x86_64                   2.4.37-21.module_el8.2.0+382+15b0afa8            @c8-media-AppStream
mysql-server.x86_64            8.0.17-3.module_el8.0.0+181+899d6349             @c8-media-AppStream
php.x86_64                     7.2.24-1.module_el8.2.0+313+b04d0a66             @c8-media-AppStream

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です