ESXiにCentOS7をきちんと大量に作成したかった（kickstart + PowerCLI）

proxmoxでリベンジしました

https://qiita.com/bashaway/items/c389ff50d4c2f61e3865

## はじめに
このエントリではESXi上にCentOS7(1810)を同一構成で多数展開する方法を記載 ~~します~~ **したかったのですが、中途半端に終わりました。**

テンプレートからのクローンや、vCenterがない場合の丸ごとコピーなど、仮想マシンの作成後にIPアドレス、ホスト名の修正箇所しても、ESXiホスト上やゲストOSの根っこのほうでインストール時のパラメータを持っててしまい、動作に影響がでるのかも？
と、おもったので、仮想マシンを新規作成してISOからインストールしたものを、省エネかつ同一環境の多数展開できるような力技を考えました。
が、あまり省力化できなかった。。。



## 対象機器および環境

* ESXi(6.5 Update1)
* Centos7(Ver18.10)


## 要件

テストなどの検証環境に利用したりするので、「まったく同一の環境」が欲しいとします。
最小インストールしたのでは、必要なパッケージが入りません。
かといってインストール作業時に必要なパッケージをポチポチするのも面倒。
だし、「あれ？さっきどれ入れたっけ？」病がでるので、再現性が重要。
本番も検証もサーバ用途になるので、IPは固定じゃなきゃダメ。


## 考え方

kickstart用にインストールISOファイルを修正 → これをkickstartのマスタISOにする。
マスタISOを修正して、展開ホスト用にパラメータ修正したインストールISOをマスタISOから生成する。
そのISOを利用してVMを作成→電源ONすれば、自動的にゲストが展開される。


## 構成要素

* CentOS7のインストールISO
* isolinux.cfg（自動起動用コンフィグ）
* ks.cfg（Kickstart用コンフィグ）
* ~~PowerCLI（コマンドラインでESXiを操作するため）~~ ← ライセンス（？）の関係でダメだった

インストール状態で、ある程度利用したいので、以下のパッケージも全自動でインストールできるようにする。

* open-vm-tools 
* mlocate
* screen 
* lftp
* tcpdump 
* unzip 
* vim 
* wget  
* epelリポジトリ

あと、firewallDはSSH以外のポリシーを消すのも、自動処理にいれました。


## Kickstart用ISOファイルの作成

### CentOSのインストールISOをまるごとコピーして作業する
近くのミラーからダウンロード
[CentOS Mirror](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso)
下記の例では `ftp.riken.jp` からダウンロードしています。

ダウンロードしたらマウントして中身を別ディレクトリに丸ごとコピーします。
ここでkickstartマスタイメージの作成を行います。

```
mkdir -p /root/work/kickstart/mnt
cd /root/work/kickstart/
wget http://ftp.riken.jp/Linux/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
mount -t iso9660 -o loop ./CentOS-7-x86_64-Minimal-1810.iso ./mnt
cp -rp ./mnt ./ks
umount ./mnt
rm -f ./CentOS-7-x86_64-Minimal-1810.iso
```

### マスター用Kickstartコンフィグ
ここでは、マスター用のkickstartコンフィグを作成します。
さいしょにマスター用KickstartのISOを作成しておき、展開時にアドレスやホスト名のみ修正したISOを作成し、利用するようにします。

以下のコンフィグでは、インストール完了後に自動的に `yum update -y` を実行させています。
検証環境などで、いつ作成しても、常に同じパッケージのみが導入されている状態にしたい場合、そのあたりを除外したほうがよいかもです。

#### kickstartコンフィグ

```:/root/work/kickstart/ks/isolinux/ks.cfg
# System authorization information
auth --enableshadow --passalgo=sha512

# Install OS instead of upgrade
install

# Use CDROM installation media
cdrom

# Use text mode install
text
firstboot --disable
ignoredisk --only-use=sda

# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'

# System language
lang ja_JP.UTF-8

# Network information
network  --bootproto=static --device=ens192 --gateway=10.254.10.254 --hostname=VMinfraserv00.prosper2.net --ip=10.254.10.100 --nameserver=10.254.10.231,10.254.10.232 --netmask=255.255.255.0 --noipv6 --activate

# Reboot after installation
reboot --eject

# Root password
rootpw --iscrypted $6$mUcdnvhr0AoBlPsi$eZ5RAc/Y06s0eQna.S32UlByCvkjqj6LBg8fUB2QxNMpP.Na5HnnDp2TOGNtfuzE2i6k1.Hu7ktAi3WqEtc6U0

# SELinux configuration
selinux --disabled

# System services
services --enabled="chronyd,firewalld"

# Do not configure the X Window System
skipx

# System timezone
timezone Asia/Tokyo --isUtc
user --groups=wheel --name=nteam --password=$6$uKHSpxHoKWtyQTgG$cDSsLr462JXKZMLhHBBQwW6kPo0CCKzeJAhZJ2Yx5Fp78TdfD3kR88r5Jy5jg9pT644bjWFIldODGgpU1mwXj/ --iscrypted --gecos="nteam"

# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm

# Clear the Master Boot Record
zerombr

# Partition clearing information
clearpart --none --initlabel

%post --logfile=/root/ks.post.log

yum update -y
yum install epel-release -y
yum install net-snmp net-snmp-utils screen lftp tcpdump unzip vim wget  open-vm-tools mlocate -y

updatedb

firewall-offline-cmd --remove-service=dhcpv6-client
firewall-offline-cmd --add-service=snmp

cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig

cat <<EOF >>/etc/snmp/snmpd.conf

com2sec p2user  default rocommunity
group   p2group v2c p2user
view    p2view    included   .1
access  p2group ""      any       noauth    exact     p2view none none

EOF

systemctl enable snmpd
systemctl start snmpd


%end


%packages
@^minimal
@core
chrony
kexec-tools

%end

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

%end

```

#### 起動時メニュー表示用のisolinux.cfg

もとISOに `isolinux.cfg` があるが、中身は削除して以下に置き換える。

```:/root/work/kickstart/ks/isolinux/isolinux.cfg
timeout 600
default setup

label setup
  menu default
  kernel vmlinuz
  append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img text
```

#### ISOファイルの生成

作業用フォルダからISOファイルを作成してマスタとして保管しておきます。
マスターを作成した作業用フォルダはまぎらわしいので、いったん削除しておきます。

```
mkisofs -J -r -o ./centos7ksmaster.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./ks
rm -rf ./ks
```



### 実機用のインストーラを作成

一度マスタのISOを作成しておけば、展開するたびにアドレスとホスト名を修正したISOを生成すればよいです。


#### 実機パラメータ

以下の実機用に修正するものとします。　

|項目|値|
|:-:|:-:|
|FQDN|VMinfraserv01.prosper2.net|
|IF|ens192|
|IP|10.254.10.101|
|Mask|255.255.255.0|
|GW|10.254.10.254|
|DNS Pri|10.254.10.231|
|DNS Sec|10.254.10.232|
|domain|prosper2.net|
|IPv6|無効|


#### マスタを作業フォルダにコピー

```
cd /root/work/kickstart/
mount -t iso9660 -o loop  ./centos7ksmaster.iso ./mnt
cp -rp mnt ksmod
umount ./mnt
```


#### パラメーラ修正

```
 sed -i -e 's/VMinfraserv00/VMinfraserv01/' ./ksmod/isolinux/ks.cfg
 sed -i -e 's/10.254.10.100/10.254.10.101/' ./ksmod/isolinux/ks.cfg
```

#### ISOを生成してESXiに転送する。

```
mkisofs -J -r -o ./VMinfraserv01_10.254.10.101.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./ksmod
scp ./VMinfraserv01_10.254.10.101.iso esxi01:/vmfs/volumes/local_ds01/images/
rm -f ./VMinfraserv01_10.254.10.101.iso
rm -rf ./ksmod
```

## ESXiで仮想マシンを展開（失敗編）

### コマンドラインで操作するため、PowerCLIをインストールする。

PowerCLIはMSのPowerShellが必要らしい

```
# curl https://packages.microsoft.com/config/rhel/7/prod.repo tee | /etc/yum.repos.d/microsoft.repo
# yum install powershell
# pwsh
(で、PowerShellになる）
PS /root> Install-Module -Name VMware.PowerCLI
PS /root> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore
```

インストール時に、「信頼されていないリポジトリからモジュールをインストールしようとしています。」とかでるので、許可してあげる。


### PowerCLIでESXiに接続

```
PS /root> Connect-VIServer [-Server] <String[]> [-User <String>] [-Password <String>]

Name                           Port  User
----                           ----  ----
esxi01                         443   root

PS /root> get-vm

Name                 PowerState Num CPUs MemoryGB
----                 ---------- -------- --------
VMwin01              PoweredOff 4        4.000
vMA                  PoweredOff 1        0.500
VMwinserv02          PoweredOn  4        2.000
vGNS3                PoweredOff 4        4.000
VMwinserv01          PoweredOn  2        2.000
VMwindows01          PoweredOn  4        4.000
VMwlc01              PoweredOn  2        8.000
VMcheck01            PoweredOn  2        2.000
VMnetserv01          PoweredOn  1        1.000


PS /root> new-vm -name VMinfraserv01 -vmhost esxi01 -Datastore local_ds01  -NumCpu 8 -DiskGB 8  -MemoryGB 1 -DiskStorageFormat thin -CD -GuestId centos7_64Guest -NetworkName PG_GuestOS_V0010
new-vm : 2019/01/12 20:19:50    New-VM          Current license or ESXi version prohibits execution of the requested operation.
At line:1 char:1
+ new-vm -name VMinfraserv01 -vmhost esxi01 -Datastore local_ds01  -Num ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [New-VM], RestrictedVersion
+ FullyQualifiedErrorId : Client20_VmServiceImpl_NewVM_ViError,VMware.VimAutomation.ViCore.Cmdlets.Commands.NewVM
```

ま、まじか。
ライセンスがないとだめってこと？


## ESXiで仮想マシンを展開（妥協編）

いたしかたない。

新規作成して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/e63ff9ac-39a2-e7d0-a1df-203c1589c4dc.png)

　
さっき作成したIOSを選択して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/dce0315f-9b4b-59bb-c111-59b15b31d6b5.png)

　
起動させると勝手にインストールしてくれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/259e15ae-1873-9bc2-5402-343127458b76.png)

　
待つこと約１５分
![image.png](https://qiita-image-store.s3.amazonaws.com/0/334782/44ab056b-b25b-5843-b8f3-321cd840db68.png)

無事にインストールできていました。

なんども中途半端。。。

## おわりに

### 感想
最後までコマンドラインでやりたかったのですが、ESXiのライセンス（？）が無く全自動まではこぎつけられませんでした。
あぁ、残念。

vim-cmd で VMXファイル自動生成して～ という方法がありそうですが、ちょっと自分にはハードルが高いです。。。



### 出典
https://www.certdepot.net/rhel7-get-started-firewalld/
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax
https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-6#centos-7
https://code.vmware.com/doc/preview?id=5975#/doc/New-VM.html