【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-baseOS
とc8-media-AppStream
の名前が付けられたリポジトリが存在し、それぞれ/media/CentOS/BaseOS
と/media/CentOS/AppStream
をYumリポジトリとして認識します。
Install packages
タスクでは、yum
モジュールのアーギュメントにdisablerepo
とenablerepo
を指定して、デフォルトで有効なリポジトリを全て無効化し、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