【小ネタ】AnsibleでAmazon Linuxのバージョンを判別するー2019年4月度版ー

# はじめに
Ansible Playbookで、OS／ディストリビューションの差異がある場合には、Factsの情報を利用してTaskを分けることが多いと思います。
Amazon Linux（初代）とAmazon Linux 2はベースとなるOSディストリビューションが違うこと（それぞれRHEL6、RHEL7をベースにしているように見える）、その他大きな変更が行われていることから、場合によっては同じTaskを適用できないことがあります。
Amazon Linux（初代）とAmazon Linux 2を判別する方法をまとめます。


# TL;DR
- 2019/4/27現在、きれいに判別する方法はまだ無さそう
- 「ansible_distribution」と「ansible_service_mgr」で判別するのが一番現実的
- 「ansible_distribution_major_version」はいずれも「NA」になる

# 利用環境
VagrantBoxで利用できるもの、EC2の最新版をそれぞれ確認しました。Ansibleはいずれも2.7.10を利用しました。

- ホスト環境
    - Windows 10 Pro (Disabling Hyper-V)
    - Oracle VirtualBox 6.0.6 r130049
    - Vagrant 2.2.4
    - Ansible 2.7.10
- Amazon Linux（初代）
    - ローカル環境（Vagrant+VirtualBox）
        - Vagrant Box: [mvbcoding/awslinux](https://app.vagrantup.com/mvbcoding/boxes/awslinux)
        - Version: v2017.03.0.20170401
    - AWS EC2環境（ap-northeast-1）
        - AMI ID: ami-00a5245b4816c38e6
        - AMI Name: amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2
        - AMI Description: Amazon Linux AMI 2018.03.0.20181129 x86_64 HVM gp2
- Amazon Linux 2
    - ローカル環境（Vagrant+VirtualBox）
        - Vagrant box: [gbailey/amzn2](https://app.vagrantup.com/gbailey/boxes/amzn2)
        - Version: v20190314.0.0
    - AWS EC2環境（ap-northeast-1）
        - AMI ID: ami-0f9ae750e8274075b
        - AMI Name: amzn2-ami-hvm-2.0.20190313-x86_64-gp2
        - AMI Description: Amazon Linux 2 AMI 2.0.20190313 x86_64 HVM gp2

# 各環境の/etc/\*-release\*、Factsを確認する
## Amazon Linux（初代） ローカル環境
下記Boxの最新版、v2017.03.0.20170401を利用しました。
[mvbcoding/awslinux](https://app.vagrantup.com/mvbcoding/boxes/awslinux)

### /etc/os-release, /etc/system-release, /etc/system-release-cpe
```:/etc/os-release
$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2017.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2017.03"
PRETTY_NAME="Amazon Linux AMI 2017.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2017.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

```

```:/etc/system-release
$ cat /etc/system-release
Amazon Linux AMI release 2017.03
```

```:/etc/system-release-cpe
$ cat /etc/system-release-cpe
cpe:/o:amazon:linux:2017.03:ga
```

### Ansible Facts
出力が長いので、必要な部分のみ抜粋します。

```
$ ansible localhost -m setup
localhost | SUCCESS => {
    "ansible_facts": {

※中略

        "ansible_distribution": "Amazon", 
        "ansible_distribution_file_parsed": true, 
        "ansible_distribution_file_path": "/etc/system-release", 
        "ansible_distribution_file_variety": "Amazon", 
        "ansible_distribution_major_version": "NA", 
        "ansible_distribution_release": "NA", 
        "ansible_distribution_version": "2017.03", 

※中略

        "ansible_os_family": "RedHat", 
        "ansible_pkg_mgr": "yum", 

※中略


        "ansible_service_mgr": "upstart", 

※中略
}
```

## Amazon Linux（初代） AWS EC2環境（ap-northeast-1）
下記AMI（ami-00a5245b4816c38e6）を利用しました。
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Images:visibility=public-images;imageId=ami-00a5245b4816c38e6;sort=name

### /etc/os-release, /etc/system-release, /etc/system-release-cpe
```:/etc/os-release
$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
```

```:/etc/system-release
$ cat /etc/system-release
Amazon Linux AMI release 2018.03
```

```:/etc/system-release-cpe
$ cat /etc/system-release-cpe
cpe:/o:amazon:linux:2018.03:ga
```

### Ansible Facts
出力が長いので、必要な部分のみ抜粋します。

```
$ ansible localhost -m setup
localhost | SUCCESS => {
    "ansible_facts": {

※中略

        "ansible_distribution": "Amazon", 
        "ansible_distribution_file_parsed": true, 
        "ansible_distribution_file_path": "/etc/system-release", 
        "ansible_distribution_file_variety": "Amazon", 
        "ansible_distribution_major_version": "NA", 
        "ansible_distribution_release": "NA", 
        "ansible_distribution_version": "2018.03", 

※中略

        "ansible_os_family": "RedHat", 
        "ansible_pkg_mgr": "yum", 

※中略

        "ansible_service_mgr": "upstart", 

※中略
}
```


## Amazon Linux 2 ローカル環境
下記Boxの最新版、v20190314.0.0を利用しました。
[gbailey/amzn2](https://app.vagrantup.com/gbailey/boxes/amzn2)

### /etc/os-release, /etc/system-release, /etc/system-release-cpe
```:/etc/os-release
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
```

```:/etc/system-release
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
```

```:/etc/system-release-cpe
$ cat /etc/system-release-cpe
cpe:2.3:o:amazon:amazon_linux:2
```

### Ansible Facts
出力が長いので、必要な部分のみ抜粋します。

```
$ ansible localhost -m setup
localhost | SUCCESS => {
    "ansible_facts": {

※中略

        "ansible_distribution": "Amazon", 
        "ansible_distribution_file_parsed": true, 
        "ansible_distribution_file_path": "/etc/system-release", 
        "ansible_distribution_file_variety": "Amazon", 
        "ansible_distribution_major_version": "NA", 
        "ansible_distribution_release": "NA", 
        "ansible_distribution_version": "(Karoo)", 

※中略

        "ansible_os_family": "RedHat", 
        "ansible_pkg_mgr": "yum", 

※中略

        "ansible_service_mgr": "systemd", 

※中略
}
```

## Amazon Linux 2 AWS EC2環境（ap-northeast-1）
下記AMI（ami-0f9ae750e8274075b）を利用しました。
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Images:visibility=public-images;imageId=ami-0f9ae750e8274075b;sort=name

### /etc/os-release, /etc/system-release, /etc/system-release-cpe
```:/etc/os-release
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
```

```:/etc/system-release
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
```

```:/etc/system-release-cpe
$ cat /etc/system-release-cpe
cpe:2.3:o:amazon:amazon_linux:2
```

### Ansible Facts
出力が長いので、必要な部分のみ抜粋します。

```
$ ansible localhost -m setup
localhost | SUCCESS => {
    "ansible_facts": {

※中略

        "ansible_distribution": "Amazon", 
        "ansible_distribution_file_parsed": true, 
        "ansible_distribution_file_path": "/etc/system-release", 
        "ansible_distribution_file_variety": "Amazon", 
        "ansible_distribution_major_version": "NA", 
        "ansible_distribution_release": "NA", 
        "ansible_distribution_version": "(Karoo)", 

※中略

        "ansible_os_family": "RedHat", 
        "ansible_pkg_mgr": "yum", 

※中略

        "ansible_service_mgr": "systemd", 

※中略
}
```

# 結論
OSバージョンの判別に使えそうな項目としては以下のようなものがありますが、Amazon Linux（初代）とAmazon Linux 2の差異が明確に分かる項目は少ないです。

- "ansible_distribution"
- "ansible_distribution_major_version"
- "ansible_distribution_release"
- "ansible_distribution_version"
- "ansible_os_family"
- "ansible_pkg_mgr"
- "ansible_service_mgr"


AnsibleのFactsにおいて、「ansible_service_mgr」はそれぞれ下記のように設定されます。

```:Amazon&nbsp;Linux&nbsp;（初代）
        "ansible_service_mgr": "upstart", 
```


```:Amazon&nbsp;Linux&nbsp;2
        "ansible_service_mgr": "systemd", 
```

理想的には「ansible_distribution_major_version」に「1」／「2」が指定されるのがいいと思いますが、そうなってはいないようです。
現実的には、「ansible_service_mgr」を使う以外の方法がなさそうです。

# 関連サイト等

下記はAmazon Linux 2が出た2017年当時の記事ですが、状況は変わっていません。

> Ansible で Amazon Linux と Amazon Linux 2 を見分ける
> https://blog.manabusakai.com/2017/12/ansible-for-amazon-linux-2/