【Ansible】Amazon EC2でansible-navigatorを使いたい～第2章：ansible-navigatorの実行～

## はじめに

前回の記事（[【Ansible】Amazon EC2でansible-navigatorを使いたい～第1章：実行環境イメージの作成～][1]）の続きです。  
今回は、第2章として「ansible-navigatorの実行」をします。ついでに、「ansible-navigator経由でansible-lintの実行」してみようと思います。

## TL;DR

- ``ansible-playbook``コマンドは``ansible-navigator run``コマンドに変化した
- ansible-navigatorには実行した内容のリプレイ機能がある
- ansible-navigator 2.0.0からansible-lintが呼び出せるようになった

## 前提

- 前回の記事（[【Ansible】Amazon EC2でansible-navigatorを使いたい～第1章：実行環境イメージの作成～][1]）の手順にもとづいて、実行環境イメージが作成してあること
  - **記事の内容をもとに作業をしてみたい方のみ**

## 詳細

### 1. ansible-navigatorの設定ファイル作成

[Ansible Documentation > ansible-navigator settings][4]を参考にして、ansible-navigatorの  
設定ファイルを作成します。  
前回の記事で作成したフォルダの中に必要なファイルを追加します

- :file_folder: /home/ec2-user/ansible_test
  - :page_facing_up: execution-environment.yml
  - :page_facing_up: ansible.cfg
  - :page_facing_up: requirements.yml
  - :page_facing_up: requirements.txt
  - :file_folder: context
  - :page_facing_up: ansible-navigator.yml ☆ ここから下を新規追加
  - :page_facing_up: .ansible-lint
  - :file_folder: playbooks
    - :page_facing_up: test.yml

1. 作業用ディレクトリに移動する

   ```console
   $ cd ~/ansible_test
   ```

2. ansible-navigator.ymlを作成する
   - ログの保管先``./logs``は自動で作成されるので、作成は不要です

   ```console
   $ vi ansible-navigator.yml
   ```

   ```yaml:ansible-navigator.yml
   ---
   ansible-navigator:
     ansible:
       config:
         path: ansible.cfg
     execution-environment:
       container-engine: podman
       enabled: true
       image: localhost/ansible-test:v0.0.1
       pull:
         policy: never
     logging:
       append: true
       file: ./logs/ansible-navigator.log
       level: debug
     mode: stdout
     playbook-artifact:
       enable: true
       replay: ./logs/artifact/replay.json
       save-as: ./logs/artifact/artifact.json
     ansible-lint:
       config: .ansible-lint
   ```

3. ansible-lintの設定ファイルを作成する

   ```console
   $ vi .ansible-lint
   ```

   ```yaml:.ansible-lint
   ---
   use_default_rules: true
   ```

### 2. 動作確認用Playbookの作成・実行

1. 動作確認用Playbook（test.yml）を作成する

   ```console
   $ mkdir playbooks
   $ vi playbooks/test.yml
   ```

   ```yaml:test.yml
   ---
   - name: "Fetch EE image info"
     hosts: localhost
     gather_facts: false
     tasks:
       - name: "fetch ansible_facts"
         ansible.builtin.setup:
           gather_subset:
             - "min"

       - name: "display ansible_facts"
         ansible.builtin.debug:
           var: ansible_facts.env

       - name: "fetch ansible version"
         ansible.builtin.command: "ansible --version"
         register: r_ansible_version
         changed_when: false

       - name: "display r_ansible_version"
         ansible.builtin.debug:
           var: r_ansible_version.stdout_lines

       - name: "fetch pip package info"
         community.general.pip_package_info:
           clients: "pip"
         register: r_pip_package

       - name: "display r_pip_info"
         ansible.builtin.debug:
           var: >-
             r_pip_package.packages.pip |
             json_query("*[0].{name: name, version: version}")
   ```

2. playbookを実行する
   - ansible-navigatorでplaybookを実行する場合は、``ansible-navigator run``です
   - ansible-playbookとansible-navigatorコマンドの比較は、[自動コンテンツナビゲーターコマンドの比較][2]を参照

   ```console
   $ ansible-navigator run playbooks/test.yml
   ```

3. artifactを使ってplaybookのリプレイを確認する
   - ansible-navigatorには実行した内容のリプレイ機能があります

   ```console
   $ ansible-navigator replay ./logs/artifact/artifact.json
   ```

### 3. ansible-lintの実行

[[Ansible] ansible-navigator 2.0.0 機能ピックアップ Part 1: 追加サブコマンド編][3]の記事  
によると、ansible-navigator 2.0.0からansible-lintが呼び出せるようになったそうなので  
実際に使ってみます

1. ansible-lintの動作確認用playbookを作成する

   ```console
   $ vi playbooks/lint-test.yml
   ```

   ```yaml:lint-test.yml
   ---
   - name: "lint test"
     hosts: localhost
     gather_facts: false
     vars:
       test: "test var"
     tasks:
       - debug:
           msg: "{{test}}"
   ```

2. ansible-lintを実行する

   ```console
   $ ansible-navigator lint lint-test.yml
   ```

   - 以下のように、2つの指摘がされていることが確認されます

     ```text
     unnamed-task: All tasks should be named
     playbooks/lint-test.yml:8 Task/Handler: debug msg={{test}}
     var-spacing: Variables should have spaces before and after: {{test}}
     playbooks/lint-test.yml:8 Task/Handler: debug msg={{test}}
     ```

     - 指摘内容

       - unnamed-task: 名前が付けられていないタスクがある
       - var-spacing: 変数定義の前後にスペースが無い

         ```text
         誤）msg: "{{test}}"
         正）msg: "{{ test }}"
         ```

3. ansible-lintの設定ファイルを編集する
   - ansible-lintの設定ファイルを編集し、``unnamed-task``を指摘しないようにします
   - skip_listに除外するルールを記載します

   ```console
   $ vi .ansible-lint
   ```

   ```yaml:.ansible-lint
   ---
   use_default_rules: true
   skip_list:  # 追加
     - unnamed-task
   ```

4. ansible-lintを実行する

   ```console
   $ ansible-navigator lint lint-test.yml
   ```

   - ``unnamed-task``が指摘されなくなりました

   ```text
   var-spacing: Variables should have spaces before and after: {{test}}
   playbooks/lint-test.yml:8 Task/Handler: debug msg={{test}}
   ```

## さいごに

- 第2章では、実際にansible-navigatorを使ってplaybookを実行しました。  
リプレイ機能やansible-lintが使えるようになり、より便利になったと感じます

## 参考URL

- [【Ansible】Amazon EC2でansible-navigatorを使いたい～第1章：実行環境イメージの作成～][1]
  - 前回の記事
- [Ansible Documentation > ansible-navigator settings][4]
  - ansible-navigatorの設定ファイルの書き方
- [Red Hat Customer Portal > 1.4. 自動コンテンツナビゲーターコマンドの比較][2]
  - ansible-playbookとansible-navigatorコマンドの比較
- [[Ansible] 「つまずき Ansible 【Part36】ansible-navigator」ふりかえり][5]
  - ansible-navigatorの使い方
- [[Ansible] ansible-navigator 2.0.0 機能ピックアップ Part 1: 追加サブコマンド編][3]
  - ansible-navigator 2.0.0の機能紹介

---

[1]: https://qiita.com/masa2223/items/5f9c641836115c3ecd1d
[2]: https://access.redhat.com/documentation/ja-jp/red_hat_ansible_automation_platform/2.0-ea/html/ansible_navigator_creator_guide/ref-navigator-command-comparison_intro-ansible-navigator
[3]: https://tekunabe.hatenablog.jp/entry/2022/04/19/ansible-navigator_2.0_intro_part1
[4]: https://ansible-navigator.readthedocs.io/en/latest/settings/
[5]: https://tekunabe.hatenablog.jp/entry/2022/03/12/ansible_stumble_36