RHEL8をKickstartでインスコする

# はじめに
- ローカルリソースの有効活用と高頻度のビルド&&クラッシュを楽にするのが目的としKickstartでOSの自動化インストール構築までの手順をまとめる

# ゴール
- M/W構築する際のベースOSを自動化で準備できること

# 環境/前提
- 仮想環境:Windowso10pro上にあるHyper-V
- インストールOS:RHEL8（現時点で8.3）
- インストーラーはBIOSモード
- NginxにてWebサーバを準備済

# Kickstartってなんぞや？
- [Red Hat Enterprise Linux 8 高度な RHEL インストールの実行](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/pdf/performing_an_advanced_rhel_installation/Red_Hat_Enterprise_Linux-8-Performing_an_advanced_RHEL_installation-ja-JP.pdf) 
- 詳細はリンク先にあるため割愛しますが一言でいうと以下の感じです

```
インストールプロセスを部分的または完全に自動化する方法を提供
```

- 手段としては大きく以下の2つ
 - 1.設定ファイルをwebサーバにUPしてそれを読み込ませる
 - 2.設定ファイルをISOに埋め込んで利用する

**2つとも検証し今回は1を採用**

# 設定ファイルの作成&&チェック
- [Kickstart Generator](https://access.redhat.com/ja/labsinfo/kickstartconfig)で作成して必要な項目追加もありですが、一度手動で構築したOSから「anaconda-ks.cfg」を利用したほうが楽です

- 要件は以下の通り
 - [MUST]ユーザー情報(スーパーユーザーと一般ユーザーの計2つ)
 - [MUST/WANT]IPアドレスの固定(後日DHCPサーバの方をいじってMACとIPを紐付ける予定
 - [MUST]M/Wのインスコする前のベースとなるOSがほしいため初期は最小構成
 - [WANT]インストール時の画面表示をgraphical（textのほうが速いそうですが、ミスしたときの箇所をわかりやすくするためあとインスコ中は放置なので遅くてもOK)

### 1.ファイルの作成

Before:ファイル名は「anaconda-ks.cfg」

```vim
#version=RHEL8
# Use graphical install
graphical

%packages
@^server-product-environment
@container-management
@debugging
@development
@file-server
@ftp-server
@gnome-desktop
@guest-agents
@hardware-monitoring
@infiniband
@mail-server
@network-file-system-client
@network-server
@performance
@remote-system-management
@smb-server
@virtualization-hypervisor
@web-server
kexec-tools

%end

# Keyboard layouts
keyboard --xlayouts='jp'
# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network  --hostname=rhel8

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone America/New_York --isUtc

# Root password
rootpw --iscrypted [乱数]
user --groups=wheel --name=[ユーザー名] --password=[乱数] --iscrypted --gecos="[ユーザー名]"

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
```

After:ファイル名は「ks_base.cfg」

```vim
#version=RHEL8
# Reboot after installation
reboot --eject
# Use graphical install
graphical

repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%post --logfile=/root/ks-post-anaconda.log
set -x
dnf -y update
dnf clean all
%end

%packages
@^minimal-environment
kexec-tools

%end

# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=static --device=eth0 --gateway=192.168.0.xxx --ip=192.168.0.xxx --nameserver=192.168.0.xxx --netmask=255.255.255.0 --noipv6 --activate
network  --hostname=baseOS

# Use CDROM installation media
cdrom

# SELinux configuration
selinux --disabled

# Run the Setup Agent on first boot
firstboot --enable
# System services
services --disabled="firewalld" --enabled="chronyd"

ignoredisk --only-use=sda
autopart --nohome
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=192.168.0.1

# Root password
rootpw --iscrypted [乱数]
user --groups=wheel --name=[ユーザー名] --password=[乱数] --iscrypted --gecos="[ユーザー名]"

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
```

### 2.記載内容の確認

```sh
# ksvalidator ks_base.cfg
#
```

- 出力結果は何も出ていなければ問題なし（syntaxチェックと考えてください

# 設定ファイルをWebサーバへUP
- Webサーバの環境はラズパイへNginxをインストールしたものとなります
- なおNginxのインスコ手順は割愛

### 1.設定ファイルをサーバへUP

```sh
# scp -i .ssh/id_xxxx ~/ks_base.cfg [RaspberryPiのユーザー@IP]:/tmp/
# ssh [RaspberryPiのユーザー@IP]
# sudo -i
# mv /tmp/kickstart/ks.cfg /var/www/html/ks_base.cfg
```

# インストール実行

### 1.TOP画面にて

- Install Red Hat Enterprise Linux 8.3にカーソルを合わせて[tab]キーを押下後に以下のコマンドを追記

```
inst.ks=http://[RaspberryPiのIP]/ks.cfg
```

![インスコ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96374/1854e591-2adf-db12-8ed7-619dff40df5a.png)
<font color="Red">**例:RaspberryPiのIP=192.168.0.254**</font>

### 補足

- Webサーバのアクセスログを見るとインストール時はDHCPでIPアドレスが一時的に払い出され(192.168.0.13)サイトから設定ファイルを読み込んでいることがわかります

```sh
# tail -F /var/log/nginx/access.log
192.168.0.13 - - [19/Mar/2021:10:39:26 +0900] "GET /ks_base.cfg HTTP/1.1" 200 1630 "-" "curl/7.61.1"
```

### 2.設定画面にて

- インストール概要では設定ファイルにある通り情報を選択しています（エラー時は該当項目の下に赤字でエラー表記される）

![インスコ途中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96374/5589673f-3b5b-b7a9-46c0-7af980a534dd.png)

### 3.インストール完了後

- 設定ファイルへで完了後に再起動を指示しているため、問題がなければ以下の通りログインもできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96374/de8fd2c6-c703-4f97-0609-1b286c94c8a4.png)

# おまけ（サブスク登録

- SUBSCRIPTION-MANAGER コマン
ドのチートシート集のリンクは後述
- サブスク登録をしないと使えないため、必要なコマンドで実施

### 1.登録

**登録**

```sh
# subscription-manager register --auto-attach
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: [ユーザー情報]
Password: [PW]
The system has been registered with ID: xxxxxxx-xx-xxxxx-xxx-xxxxxxxxx
The registered system name is: baseOS
Installed Product Current Status:
Product Name: Red Hat Enterprise Linux for x86_64
Status:       Subscribed <--ここが「Subscribed」になっていればOK
```

### 2.適用の確認

**コマンドでの確認方法**

```sh
# subscription-manager list
+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux for x86_64
Product ID:     479
Version:        8.3
Arch:           x86_64
Status:         Subscribed
Status Details: 
Starts:         12/11/20
Ends:           12/11/21
```

**ポータルサイトからの確認方法**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96374/1e266943-49e4-352c-0972-b40dedae8bd8.png)

# さいごに
- 何度か試してみたので意外と時間がかかりましたが、おかげで今後は楽にベースOSの準備がでるようになりました
- IPアドレスと秘密鍵の登録は今後の運用でどうするか考えておきたいかと（のちにAnsibleが続くので
- 今後はHyper-Vで行う設定の自動化やM/Wの構築の自動化をterraform/Ansibleで実装していきたいかと
- あと前にUPした構築ツールもAnsibleとかに置き換えたい...


# 多謝/参考サイト
- [CentOS8 を Kickstart で自動インストールする](https://sig9.hatenablog.com/entry/2019/12/30/000000)
- [RED HAT BLOG](https://www.redhat.com/en/blog/new-year-new-red-hat-enterprise-linux-programs-easier-ways-access-rhel)
- [Red Hat Enterprise Linux 8 高度な RHEL インストールの実行](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/pdf/performing_an_advanced_rhel_installation/Red_Hat_Enterprise_Linux-8-Performing_an_advanced_RHEL_installation-ja-JP.pdf) 
- [Kickstart Generator](https://access.redhat.com/ja/labsinfo/kickstartconfig)
- [SUBSCRIPTION-MANAGER コマン
ドのチートシート](https://access.redhat.com/sites/default/files/attachments/rh_sm_command_cheatsheet_1214_jcs_print-ja.pdf)
- [第3章 SUBSCRIPTION MANAGER コマンドラインでサブスクリプションの登録、割り当て、および削除](https://access.redhat.com/documentation/ja-jp/red_hat_subscription_management/1/html/rhsm/reg-cli#reg-cli-attach)
- [Red Hat Enterprise Linux7インストールガイド4.2. 自動インストール](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-simple-install-kickstart)