RHEL 8.4 (ppc64le) へ cloud-init を導入


#####はじめに

PowerVC キャプチャーイメージのため RHEL 8.4 サーバーに cloud-init を導入します。

参考：

・Installing and configuring cloud-init on Linux®

https://www.ibm.com/docs/en/powervc/2.0.2?topic=init-installing-configuring-cloud-linux

---

#####環境

RHEL 8.4 (ppc64le, Server with GUI で導入) on Power Systems S824


```
# cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.4 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.4 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.4:GA"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/red_hat_enterprise_linux/8/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.4
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.4"
```

---

##### yum repository 構成

インストールiso ファイルを使用して、BaseOS と AppStream の yum repository を構成します。


メディア・マウント

````
[root@test-cloudinit ~]# mkdir -p /media/rhel84dvd
[root@test-cloudinit ~]# mount /dev/sr0 /media/rhel84dvd/
mount: /media/rhel84dvd: WARNING: device write-protected, mounted read-only.
[root@test-cloudinit ~]# ls -l /media/rhel84dvd
total 48
dr-xr-xr-x. 4 root root  2048 May  3  2021 AppStream
dr-xr-xr-x. 4 root root  2048 May  3  2021 BaseOS
dr-xr-xr-x. 3 root root  2048 May  3  2021 boot
-r--r--r--. 1 root root  8154 May  3  2021 EULA
-r--r--r--. 1 root root  1455 May  3  2021 extra_files.json
-r--r--r--. 1 root root 18092 May  3  2021 GPL
dr-xr-xr-x. 2 root root  2048 May  3  2021 images
-r--r--r--. 1 root root   103 May  3  2021 media.repo
dr-xr-xr-x. 3 root root  2048 May  3  2021 ppc
-r--r--r--. 1 root root  1669 May  3  2021 RPM-GPG-KEY-redhat-beta
-r--r--r--. 1 root root  5134 May  3  2021 RPM-GPG-KEY-redhat-release
-r--r--r--. 1 root root  1796 May  3  2021 TRANS.TBL
````

リポジトリー・ファイル作成

```
# cat /etc/yum.repos.d/rhel84_base.repo
[dvd-BaseOS]
name=RHEL84_BaseOS
baseurl=file:///media/rhel84dvd/BaseOS/
enabled=1
gpgcheck=0
gpgkey=file:///media/rhel84dvd/RPM-GPG-KEY-redhat-release

[dvd-AppStream]
name=RHEL84_AppStream
baseurl=file:///media/rhel84dvd/AppStream/
enabled=1
gpgcheck=0
gpgkey=file:///media/rhel84dvd/RPM-GPG-KEY-redhat-release

```

設定確認

```
# yum repolist
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

repo id                                repo name
dvd-AppStream                          RHEL84_AppStream
dvd-BaseOS                             RHEL84_BaseOS
```

----

#####cloud-init 導入

cloud-init は、マニュアルにリンクがある以下のRHEL8.0用のモジュールを使用します。
http://public.dhe.ibm.com/systems/virtualization/powervc/powervc-2.0/rhel8_cloud_init/

```
# ls -l
total 3468
-rw-r--r-- 1 root root 1011136 Aug 19  2020 cloud-init-19.1-8.ibm.el8.noarch.rpm

# yum install ./cloud-init-19.1-8.ibm.el8.noarch.rpm

依存関係が解決しました。
==================================================================================================================================
 パッケージ                          アーキテクチャー       バージョン                        リポジトリー                  サイズ
==================================================================================================================================
インストール:
 cloud-init                          noarch                 19.1-8.ibm.el8                    @commandline                  987 k
依存関係のインストール:
python3-jsonpatch                 noarch                 1.21-2.el8                        dvd-AppStream                  27 k
python3-jsonpointer               noarch                 1.10-11.el8                       dvd-AppStream                  20 k
python3-jwt                       noarch                 1.6.1-2.el8                       dvd-BaseOS                     43 k
python3-oauthlib                  noarch                 2.1.0-1.el8                       dvd-BaseOS                    155 k

トランザクションの概要
==================================================================================================================================
インストール  5 パッケージ

合計サイズ: 1.2 M
インストール後のサイズ: 3.9 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中

  準備             :  [====================                                                                                 ] 1/1

~ 省略 ~

  インストール中   : cloud-init-19.1-8.ibm.el8.noarch                                                                         5/5 

  scriptletの実行中: cloud-init-19.1-8.ibm.el8.noarch                                                                         5/5 

  検証             : python3-jwt-1.6.1-2.el8.noarch                                                                           1/5 

  検証             : python3-oauthlib-2.1.0-1.el8.noarch                                                                      2/5 

  検証             : python3-jsonpatch-1.21-2.el8.noarch                                                                      3/5 

  検証             : python3-jsonpointer-1.10-11.el8.noarch                                                                   4/5 

  検証             : cloud-init-19.1-8.ibm.el8.noarch                                                                         5/5 
Installed products updated.

インストール済み:
  cloud-init-19.1-8.ibm.el8.noarch        python3-jsonpatch-1.21-2.el8.noarch        python3-jsonpointer-1.10-11.el8.noarch       
  python3-jwt-1.6.1-2.el8.noarch          python3-oauthlib-2.1.0-1.el8.noarch       

完了しました!
```

dvd-BaseOS と dvd-AppStream のみで導入できました。よかった..。


導入した cloud-init を確認します。

```
# rpm -qi cloud-init
Name        : cloud-init
Version     : 19.1
Release     : 8.ibm.el8
Architecture: noarch
Install Date: Sun Dec  5 09:53:54 2021
Group       : Unspecified
Size        : 3198593
License     : ASL 2.0 or GPLv3
Signature   : (none)
Source RPM  : cloud-init-19.1-8.ibm.el8.src.rpm
Build Date  : Thu Jul 30 14:26:48 2020
Build Host  : b4916ccab9e8
Relocations : (not relocatable)
URL         : http://launchpad.net/cloud-init
Summary     : Cloud instance init scripts
Description :
Cloud-init is a set of init scripts for cloud instances.  Cloud instances
need special scripts to run during initialization to retrieve and install
ssh keys and to let the user run various scripts.
```

cloud-init 19.1-8 が導入されました。


---

##### cloud-init の構成


cloud-init を構成位します。
導入直後の /etc/cloud/cloud.cfg を確認。

```
# cat /etc/cloud/cloud.cfg
# The top level settings are used as module
# and system configuration.

# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
   - default

# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the default $user
disable_root: false

mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_pwauth:   0

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false
datasource_list: [ ConfigDrive, None ]
datasource:
  ConfigDrive:
    dsmode: local
# Example datasource config
# datasource:
#    Ec2:
#      metadata_urls: [ 'blah.com' ]
#      timeout: 5 # (defaults to 50 seconds)
#      max_wait: 10 # (defaults to 120 seconds)

# The modules that run in the 'init' stage
cloud_init_modules:
 - migrator
 - seed_random
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - disk_setup
 - mounts
 - update_etc_hosts
 - ca-certs
 - rsyslog
 - users-groups
 - ssh

# The modules that run in the 'config' stage
cloud_config_modules:
 - ssh-import-id
 - locale
 - set-passwords
 - spacewalk
 - yum-add-repo
 - ntp
 - timezone
 - runcmd

# The modules that run in the 'final' stage
cloud_final_modules:
 - package-update-upgrade-install
 - puppet
 - chef
 - mcollective
 - salt-minion
 - rightscale_userdata
 - scripts-vendor
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change
 - reset_rmc
 - refresh_rmc_and_interface
 - set_hostname_from_dns
# System and/or distro specific settings
# (not accessible to handlers/transforms)
system_info:
   # This will affect which distro class gets used
   distro: rhel
   # Default user name + that default users groups (if added/used)
   default_user:
     name: rhel
     lock_passwd: True
     gecos: rhel Cloud User
     groups: [wheel, adm, systemd-journal]
     sudo: ["ALL=(ALL) NOPASSWD:ALL"]
     shell: /bin/bash
   # Other config here will be given to the distro class and/or path classes
   paths:
      cloud_dir: /var/lib/cloud/
      templates_dir: /etc/cloud/templates/
   ssh_svcname: sshd
```

----

マニュアルを参照して、/etc/cloud/cloud.cfg を編集します。
「RHEL での cloud-init のインストールおよび構成」を実施します。

https://www.ibm.com/docs/ja/powervc/2.0.2?topic=linux-installing-configuring-cloud-init-rhel


```
# cp -p /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg_bk
# ls -l cloud.cfg*
-rw-r--r-- 1 root root 2435 Dec  5 10:09 cloud.cfg
-rw-r--r-- 1 root root 2337 Jul 30  2020 cloud.cfg_bk



#vi /etc/cloud/cloud.cfg

=> 修正追加

# diff cloud.cfg cloud.cfg_bk
17d16
< manage_resolv_conf: false
21,22c20
<
< datasource_list: [ ConfigDrive, NoCloud, None ]
---
> datasource_list: [ ConfigDrive, None ]
24c22
<   ConfigDrive:
---
>   ConfigDrive:
43c41
< # - update_etc_hosts
---
>  - update_etc_hosts
52c50
< # - locale
---
>  - locale
80c78
< # - set_hostname_from_dns
---
>  - set_hostname_from_dns
99,104d96
<
< runcmd:
< - rm -f /etc/machine-id
< - systemd-machine-id-setup
```

新規ファイル /etc/cloud/ds-identify.cfg を作成し、以下のデータを追加

```
# vi /etc/cloud/ds-identify.cfg
~ 記載して保存終了 ~ 

# cat /etc/cloud/ds-identify.cfg
policy: search,found=all,maybe=all,notfound=disabled
```

NetworkManager の upgrade

```
# yum upgrade NetworkManager
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

Last metadata expiration check: 1:11:53 ago on Mon 08 Nov 2021 06:51:45 PM EST.
Dependencies resolved.
Nothing to do.
Complete!
```

register はまた今度...。


対象サービスの有効化と起動

```
# systemctl enable cloud-init-local.service
Created symlink /etc/systemd/system/cloud-init.target.wants/cloud-init-local.service → /usr/lib/systemd/system/cloud-init-local.service.

# systemctl enable cloud-init.service
Created symlink /etc/systemd/system/cloud-init.target.wants/cloud-init.service → /usr/lib/systemd/system/cloud-init.service.

# systemctl enable cloud-config.service
Created symlink /etc/systemd/system/cloud-init.target.wants/cloud-config.service → /usr/lib/systemd/system/cloud-config.service.

# systemctl enable cloud-final.service
Created symlink /etc/systemd/system/cloud-init.target.wants/cloud-final.service → /usr/lib/systemd/system/cloud-final.service.


# systemctl list-unit-files | grep cloud
cloud-config.service                       enabled
cloud-final.service                        enabled
cloud-init-local.service                   enabled
cloud-init.service                         enabled
cloud-config.target                        static
cloud-init.target                          enabled-runtime
```


---

##### cloud-init サービスの起動

```
# systemctl start cloud-init.service

# systemctl start cloud-init-local.service

# systemctl start cloud-config.service

# systemctl start cloud-final.service

```

---

これでキャプチャー準備ができました。
cloud-init の構成はもっといろいろ凝れそうですが一旦マニュアル・ベースの修正まで。


参考：

https://cloudinit.readthedocs.io/en/19.1/topics/examples.html


キャプチャー後は cloud-init 起動を停止しておいたりした方が良いかもしれません。

以上です。