【ルール説明・basic】name

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

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

### name

[name](https://ansible-lint.readthedocs.io/rules/name/)はtaskとplayにおいて適切に名前が付けられているか検証します。`name`キーはAnsibleの実行ログにおいて処理を識別するための重要な要素になります。taskおよびplayには基本的には必ず`name`キーを付けるようにします。

```yaml:tasks/main.yml
tasks:
  - name: make sure apache is running # <- この部分を検証する
    service:
      name: httpd
      state: started
```

### name[casing]

名前はアルファベットの大文字から始まる必要があります。

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

```yaml:tasks/main.yml
---
- hosts: all
  become: true

  tasks:
    - name: load and execute roles # <- アルファベットの小文字から始まっている
      ansible.builtin.include_role:
        name: "{{ item }}"
      loop:
        - mamono210.aws_s3_bootstrap
        - mamono210.aws_s3_get
```

#### 修正されたコード

```yaml:tasks/main.yml
---
- hosts: all
  become: true

  tasks:
    - name: Load and execute roles # <- アルファベットの大文字から始まっている
      ansible.builtin.include_role:
        name: "{{ item }}"
      loop:
        - mamono210.aws_s3_bootstrap
        - mamono210.aws_s3_get
```


### name[missing]

すべてのtaskに`name`キーを付ける必要があります。

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

```yaml:prepare.yml
.
.
.
  - ansible.builtin.include_tasks: create_resources.yml
    when: resource_state == 'present'
.
.
.
```

#### 修正されたコード

```yaml:prepare.yml
.
.
.
  - name: Create EC2 instance
    ansible.builtin.include_tasks: create_resources.yml
    when: resource_state == 'present'
.
.
.



```

### name[play]

すべてのplayに`name`キーを付ける必要があります。

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

```yaml:tasks/main.yml
---
- hosts: all
  become: true

  tasks:
    - name: Load and execute roles
      ansible.builtin.include_role:
        name: "{{ item }}"
      loop:
        - mamono210.aws_s3_bootstrap
        - mamono210.aws_s3_get
```

#### 修正されたコード

```yaml:tasks/main.yml
---
- name: Prepare
  hosts: all
  become: true

  tasks:
    - name: Load and execute roles
      ansible.builtin.include_role:
        name: "{{ item }}"
      loop:
        - mamono210.aws_s3_bootstrap
        - mamono210.aws_s3_get
```
### name[prefix] 

`main.yml`以外のファイルをinculdeして扱う場合にprefixをつけます。このルールは[opt-in](https://qiita.com/mamono210/items/a8c9c6301522f471229c#opt-in)のため初期設定では無効化されています。

例えば`main.yml`で`deploy.yml`をinculdeして扱う場合prefilxに`depoly`を付与する事によりこの処理がどのファイルから呼ばれているか判別することが容易になります。

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

```yaml:tasks/deploy.yml
.
.
.
  - name: Restart Apache
    ansible.builtin.service:
      name: httpd
      state: restarted
.
.
.
```

#### 修正されたコード

```yaml:tasks/deploy.yml
.
.
.
  - name: deploy | Restart Apache
    ansible.builtin.service:
      name: httpd
      state: restarted
.
.
.
```
### name[template]

`name`キーではJinjaテンプレートで記述する箇所は末尾にのみあるべき、と言う事らしいです。`name`キーの内部でJinjaテンプレートを使用することレンダリングが不可能な場合があるため推奨されていません。

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

```yaml:tasks/main.yml
.
.
.
  - name: Grant permissions to {{ mariadb_db_user }} on {{ mariadb_db_name }}
    community.mysql.mysql_user:
      name: '{{ mariadb_db_user }}'
      password: '{{ mariadb_db_password }}'
.
.
.
```

#### 修正されたコード

```yaml:tasks/main.yml
.
.
.
  - name: Grant permissions to the user on the {{ mariadb_db_name }}
    community.mysql.mysql_user:
      name: '{{ mariadb_db_user }}'
      password: '{{ mariadb_db_password }}'
.
.
.
```

基本的には`name`キーではJinjaテンプレートは利用しない方が良いのかもしれません。

```yaml:tasks/main.yml
.
.
.
  - name: Grant permissions to the user on the database
    community.mysql.mysql_user:
      name: '{{ mariadb_db_user }}'
      password: '{{ mariadb_db_password }}'
.
.
.
```

### 参考サイト

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