CentOS8で遊んでみる

[DMM.com Advent Calendar 2019](https://qiita.com/advent-calendar/2019/dmm) 17日目の記事です。

DMMの動画配信におけるインフラを担当しています @sinnershiki です。

去年のDMM.comアドベントカレンダーでは[StackStorm入門的な話](https://qiita.com/sinnershiki/items/06f351f1e92ecd5c827e)をしましたが、今年は9月にリリースされたCentOS8について紹介できたらと思います。

# 大きな変更点の概要

[CentOS 8 と CentOS 7 の違い、yum やミドルウェアにも要注意](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3991)

上記でも紹介されているようにミドルウェア的な変更点は下記の3つが有名どころかと思います。

- yum -> dnf
- ntp -> chrony
- iptables -> nftables

ただ、実際に使ってみた際の差分はこれだけでは分からないので、OSインストールから試したいと思います。

あと、個人的に気になっているpythonのデフォルトが2系から3系に変わったことについてもちょっと記載できればと思います。

# 環境

今回は、いろいろな環境で遊んでみたいと思うので適当なサーバにOSを入れるところから始めつつ、vagrantのbento/centos-8イメージも併用して遊んでみたいと思います。

## 環境1
そのへんに余ってた適当なサーバ


## 環境2
vagrant

https://app.vagrantup.com/bento/boxes/centos-8

```.rb
Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-8"
end
```

# インストール

OSインストールは適当なサーバにやってみました。別にVMでもよかったんですが、余っていたので。

大きな変更はなく、Softwareインストール部分の選択がそこそこ変わってたかなー？ぐらいでした。

<img width="819" alt="スクリーンショット 2019-10-17 16.44.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63136/6ad9aae8-4f24-8805-95e1-bb8311bb0b71.png">
<img width="817" alt="スクリーンショット 2019-10-17 16.47.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63136/7e1f89f7-b333-49bc-a7aa-7ad73ca694c6.png">

disk割当自動生成も大きな変更なしでした
<img width="818" alt="スクリーンショット 2019-10-17 16.49.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63136/32d0e371-b45a-b89b-1899-e70ed18327ed.png">

ちなみに、Softwareの選択項目が大きく変わったことでどこにnetwork-scriptがあるのか分からない状態になり、何も調べずに入れるとnetwork-scriptが入ってない状態のサーバが上がってきました。

本格的にちゃんとNetworkManagerを運用しないといけないのかなあという機運になりますね。

```shell-session
% systemctl status network
Unit network.service could not be found.
```

# dnf

ここから先は基本的にvagrant環境でごにょごにょしたいと思います。

yumの代替え品で、yumがpython2系で動いていたのに対してdnfはpython3系で動いています。ただ、yumコマンドは変わらず使えます。というのも、dnfのエイリアスになっているようです。
なので、通常使う分にもyumと比較してもそこまで大きく使い方の変化はないように感じました。

[DNF Command Reference](https://dnf.readthedocs.io/en/latest/command_ref.html)

下記は試しにdnfでtmux入れたときのコマンドです。

```shell-session
[root@vm01 ~]# which dnf
/usr/bin/dnf
[root@vm01 ~]# which yum
/usr/bin/yum
[root@vm01 ~]# ls -la /usr/bin/yum
lrwxrwxrwx. 1 root root 5 May 13  2019 /usr/bin/yum -> dnf-3
[root@vm01 ~]# dnf search tmux
Last metadata expiration check: 0:00:22 ago on Sun 15 Dec 2019 01:35:52 PM UTC.
============================ Name Exactly Matched: tmux =============================
tmux.x86_64 : A terminal multiplexer
tmux.i686 : A terminal multiplexer
tmux.x86_64 : A terminal multiplexer
[root@vm01 ~]# dnf install -y tmux
Datadog, Inc.                                         23 kB/s | 2.5 kB     00:00
CentOS-8 - AppStream                                 1.4 MB/s | 6.3 MB     00:04
CentOS-8 - Base                                      1.7 MB/s | 7.9 MB     00:04
CentOS-8 - Extras                                    791  B/s | 2.1 kB     00:02
Dependencies resolved.
=====================================================================================
 Package          Arch               Version                Repository          Size
=====================================================================================
Installing:
 tmux             x86_64             2.7-1.el8              BaseOS             317 k

Transaction Summary
=====================================================================================
Install  1 Package

Total download size: 317 k
Installed size: 781 k
Downloading Packages:
tmux-2.7-1.el8.x86_64.rpm                            285 kB/s | 317 kB     00:01
-------------------------------------------------------------------------------------
Total                                                119 kB/s | 317 kB     00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                             1/1
  Installing       : tmux-2.7-1.el8.x86_64                                       1/1
  Running scriptlet: tmux-2.7-1.el8.x86_64                                       1/1
  Verifying        : tmux-2.7-1.el8.x86_64                                       1/1

Installed:
  tmux-2.7-1.el8.x86_64

Complete!
[root@vm01 ~]# dnf list --installed | grep tmux
tmux.x86_64                          2.7-1.el8                             @BaseOS
```

## dnfへのリポジトリの追加について

[DNF Configuration Reference](https://dnf.readthedocs.io/en/latest/conf_ref.html)

基本的に `/etc/yum.repo.d/*.repo` を読んでくれるみたいです。ここもyumと差分ないですね。`/etc/dnf/dnf.conf`に記載してても読み込んでくれるとのことでした。
リポジトリ設定は通常yum.repo.dで行われ、優先順位もyum.repo.dの方が高いとのことだったで、repoファイルの扱いはyum変わらない感じですね。
これ、dnfが浸透したあとはどうするんでしょうね？

下記はCentOSのepelリポジトリを追加した様子です。相変わらずepel-releaseをインストールすれば入るのでdnfになっても変わらないですね。

```shell-session
[root@vm01 ~]# dnf install epel-release
Last metadata expiration check: 0:12:21 ago on Sun 15 Dec 2019 01:35:52 PM UTC.
Dependencies resolved.
=====================================================================================
 Package                Arch             Version              Repository        Size
=====================================================================================
Installing:
 epel-release           noarch           8-5.el8              extras            22 k

Transaction Summary
=====================================================================================
Install  1 Package

Total download size: 22 k
Installed size: 30 k
Is this ok [y/N]: y
Downloading Packages:
epel-release-8-5.el8.noarch.rpm                       21 kB/s |  22 kB     00:01
-------------------------------------------------------------------------------------
Total                                                9.5 kB/s |  22 kB     00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                             1/1
  Installing       : epel-release-8-5.el8.noarch                                 1/1
  Running scriptlet: epel-release-8-5.el8.noarch                                 1/1
  Verifying        : epel-release-8-5.el8.noarch                                 1/1

Installed:
  epel-release-8-5.el8.noarch

Complete!
[root@vm01 ~]# ls -la /etc/yum.repos.d/epel.repo
-rw-r--r--. 1 root root 1206 Aug  6 18:17 /etc/yum.repos.d/epel.repo
[root@vm01 ~]# cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch/debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/SRPMS
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1
```

# iptables

最初にも記載したとおりiptablesからnftablesに入れ替わってます。firewalldの裏側もiptablesからnftablesに変わっていますが、firewalldを運用する上では別に困るところはなさそうでした。

加えて、iptablesが全く使えなくなったわけではなく、実はインストールすれば使えるようですね。

というわけで、運用を今すぐ変えたくない場合は延命はできそうです。それがいいかどうかは怪しいところですが・・・。

```
[root@vm01 ~]# dnf install -y  iptables-services
Last metadata expiration check: 1:20:15 ago on Mon 16 Dec 2019 01:11:06 AM UTC.
Dependencies resolved.
=====================================================================================
 Package                  Arch          Version                  Repository     Size
=====================================================================================
Installing:
 iptables-services        x86_64        1.8.2-9.el8_0.1          BaseOS         58 k

Transaction Summary
=====================================================================================
Install  1 Package

Total download size: 58 k
Installed size: 20 k
Downloading Packages:
iptables-services-1.8.2-9.el8_0.1.x86_64.rpm         691 kB/s |  58 kB     00:00
-------------------------------------------------------------------------------------
Total                                                 42 kB/s |  58 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                             1/1
  Installing       : iptables-services-1.8.2-9.el8_0.1.x86_64                    1/1
  Running scriptlet: iptables-services-1.8.2-9.el8_0.1.x86_64                    1/1
  Verifying        : iptables-services-1.8.2-9.el8_0.1.x86_64                    1/1

Installed:
  iptables-services-1.8.2-9.el8_0.1.x86_64

Complete!
[root@vm01 ~]# systemctl stop firewalld nftables
[root@vm01 ~]# systemctl disable firewalld nftables
[root@vm01 ~]# systemctl enable iptables
Created symlink /etc/systemd/system/basic.target.wants/iptables.service → /usr/lib/systemd/system/iptables.service.
[root@vm01 ~]# systemctl start iptables
[root@vm01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

# python

今までCentOSはyumがpythonで動いていたこともあって、デフォルトでpythonが入っていてpythonコマンドが使えました。

```
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# python -V
Python 2.7.5
```

しかし、CentOS8では実はデフォルトでpythonコマンドにパスが通っていないです。dnfでは利用しているはずなので、存在はしているのでその場所を探ってみましょう。

```
[root@vm01 ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
[root@vm01 ~]# python -V
-bash: python: command not found
[root@vm01 ~]# head /usr/bin/dnf
#!/usr/libexec/platform-python
# The dnf executable script.
#
# Copyright (C) 2012-2016 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
[root@vm01 ~]# ls -la /usr/libexec/platform-python
lrwxrwxrwx. 1 root root 20 Oct  7 18:00 /usr/libexec/platform-python -> ./platform-python3.6
[root@vm01 ~]# /usr/libexec/platform-python -V
Python 3.6.8
```

とまあこんな感じで`/usr/libexec/platform-python`にpythonがいることがわかりました。これ、実は一部のソフトウェアに影響があってansibleの2.7系まではこれの影響でデフォルトでは動かないです。
ansible 2.8.0からは、[ChangeLog](https://github.com/ansible/ansible/blob/stable-2.8/changelogs/CHANGELOG-v2.8.rst#v280)にもあるようにデフォルトのpythonがないとその場所を探す仕様が入ったようです。

```
% ansible -i inventory all -m ping
vm01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
```

CentOS8に対してansible2.7系以下を動かす場合は [ansible_python_interpreter](https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#connection-variables) というパラメータを指定してあげるといいです。

```shell-session
% ansible --version
ansible 2.7.10
  ansible python module location = /opt/rh/python27/root/usr/lib/python2.7/site-packages/ansible
  executable location = /opt/rh/python27/root/usr/bin/ansible
  python version = 2.7.13 (default, Apr 12 2017, 06:53:51) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]
% ansible -i inventory all -m shell -a "cat /etc/redhat-release" -kK
SSH password:
SUDO password[defaults to SSH password]:
server | FAILED! => {
    "changed": false,
    "module_stderr": "Shared connection to xxx.xxx.xxx.xxx closed.\r\n",
    "module_stdout": "/bin/sh: /usr/bin/python: No such file or directory\r\n",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error",
    "rc": 127
}
% ansible -i inventory all -m shell -a "cat /etc/redhat-release" -kK --extra-vars='ansible_python_interpreter=/usr/libexec/platform-python'
SSH password:
SUDO password[defaults to SSH password]:
server | CHANGED | rc=0 >>
CentOS Linux release 8.0.1905 (Core)
```

# まとめ

本当はリリース時に検証したときにdatadogが動かなかったりした問題を片付けるか原因まで探るみたいなことをしたかったんですが、さすがにリリースから2ヶ月も経つとしっかり対応されてました。

というわけで、現状かなり使える環境になってきたと思いますので、そろそろ本格的にCentOS8を使い始めても問題はないかと思います。

CentOS7はまだ使えますが、CentOS６のEOL[^EOL]は迫ってますし、新しいOSを使っていきたいですね。
[^EOL]: [CentOS6のEOL](https://wiki.centos.org/About/Product)は、November 30th, 2020