【ルール説明・safety】latest・package-latest

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 16日目の記事になります。

今回はルール[latest](https://ansible-lint.readthedocs.io/rules/latest/)と[package-latest](https://ansible-lint.readthedocs.io/rules/package-latest/)について説明します。


### latest

[latest](https://ansible-lint.readthedocs.io/rules/latest/)は[ansible.builtin.git](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/git_module.html)モジュールおよび[community.general.hg](https://docs.ansible.com/ansible/latest/collections/community/general/hg_module.html)モジュールにおいてソースコードが副作用が起こらないように取得されるか検証します。 

#### 問題のあるコードその１

```yaml
---
- name: Example for `latest` rule
  hosts: localhost
  tasks:
    - name: Risky use of git module
      ansible.builtin.git:
        repo: "https://foosball.example.org/path/to/repo.git"
        version: HEAD # <-- HEADが指定されているためリポジトリの更新状態によりどのバージョンのコードが取得されるのか決まっていない
```

#### 修正されたコードその１

```yaml
---
- name: Example for `latest` rule
  hosts: localhost
  tasks:
    - name: Safe use of git module
      ansible.builtin.git:
        repo: "https://foosball.example.org/path/to/repo.git"
        version: abcd1234... # <-- コミットのSHA・タグ・ブランチ名等を指定し一意のコミットIDが指定されるようにする
```

#### 問題のあるコードその2

```yaml
---
- name: Example for `latest` rule
  hosts: localhost
  tasks:
    - name: Risky use of git module
      ansible.builtin.git:
        repo: "https://foosball.example.org/path/to/repo.git"
        version: main # <- mainブランチが指定されている
```

#### 修正されたコードその２

```yaml
---
- name: Example for `latest` rule
  hosts: localhost
  tasks:
    - name: Safe use of git module
      ansible.builtin.git:
        repo: "https://foosball.example.org/path/to/repo.git"
        version: main # noqa: latest <- mainブランチが常に安全であると確信がある場合はAnsible lintの検証をスキップする
```



### package-latest

[package-latest](https://ansible-lint.readthedocs.io/rules/package-latest/)はOSのパッケージマネージャーが安全に副作用が起きないようにソフトウェアをインストールできるか検証します。

Ansibleでは`パッケージを新規インストールする場合はバージョンを指定する`、`すでにインストールされたパッケージをアップデートする場合は余計なソフトウェアをインストールしない`ように記述するのが望ましいとのことです。


#### 問題のあるコードその１

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install Ansible
      ansible.builtin.yum:
        name: ansible
        state: latest # <- 最新版のパッケージをインストールする
```

#### 修正されたコードその１

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install Ansible
      ansible.builtin.yum:
        name: ansible-2.12.7.0 # <- バージョンを指定する
        state: present
```

#### 問題のあるコードその２

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install Ansible-lint
      ansible.builtin.pip:
        name: ansible-lint
      args:
        state: latest # <- 最新版のパッケージを新規インストールする
```

#### 修正されたコードその２

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install Ansible-lint
      ansible.builtin.pip:
        name: ansible-lint
      args:
        state: present
        version: 5.4.0 # <- バージョンを指定する
```

#### 問題のあるコードその3

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install some-package
      ansible.builtin.package:
        name: some-package
        state: latest # <- 最新版のパッケージをインストールする
```

#### 修正されたコードその3

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install some-package
      ansible.builtin.package:
        name: some-package
        state: present # <- presentを指定する
```

#### 問題のあるコードその4

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Install Ansible with update_only to false
      ansible.builtin.yum:
        name: sudo
        state: latest
        update_only: false # <- パッケージを最新版にアップデートする
```

#### 修正されたコードその4

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Update Ansible with update_only to true
      ansible.builtin.yum:
        name: sudo
        state: latest
        update_only: true # <- アップデートの実行はするが他のソフトウェアはインストールしない
```

### 参考サイト

* [latest — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/latest/)
* [package-latest — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/package-latest/)