初めてAnsibleを使ってみた③ モジュール検証

もう少しプレイブックの中身を細かく勉強してみます。
前回の記事

https://qiita.com/starroadkoichi1128/items/83598d0e41d27c57f68a

プレイブックで使用できるモジュールについては
以下のサイトにあるようです。が、数多すぎぃ・・

https://docs.ansible.com/ansible/latest/collections/index_module.html

ということでネットサーフィンしながら実際に
自分がサーバ構築する想定で使えそうなモジュールを検証してみます。
またプレイブックの中で変数を使用できるようなので合わせて試してみます。

# Vars 変数宣言

変数を宣言して使用することができます。
複数個所で使用している名称とかは変数化したほうがメンテナンスは
楽になりますね。

変数の書き方はかなり柔軟でそれぞれの強弱があります。
今回は検証なので同じプレイブック内に記載する方法を試してみます。

前回作成したプレイブック

    - hosts: all
      tasks:
        - name: slインストール
          yum: name=sl

一部変数化したプレイブック

    - hosts: all
      vars:
        sname: sl
      tasks:
        - name: slインストール
          yum: name={{sname}}

この二つのプレイブックは同じ結果になります。
変数snameを宣言してslという値を設定します。
参照するときは{{変数名}}とします。


凄いまとまっていて参考にさせていただいた記事

https://qiita.com/answer_d/items/b8a87aff8762527fb319

# copy モジュール

Ansibleサーバにあるファイル、ディレクトリをクライアントにコピーします。
初期構築時にコンフィグファイルをコピーすることがあるので
使う機会は多そうに感じます。

コンフィグファイル(仮)をAnsibleサーバーに作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/58ed9ff1-e44a-4e9b-820d-603956c840ac.png)

次にプレイブックを作成します。
折角なので変数で指定しました。
srcにコピー元(Ansibleサーバ側)のファイルの絶対パス
destにクライアント側の配置先ディレクトリを指定します。


    - hosts: all
      vars:
        sname: /home/cp.file
      tasks:
        - name: ファイルコピーテスト
          copy:
            src={{sname}}
            dest=/root

実行してみると正常に完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/61d6983f-4f5a-47ef-809e-9f6150a30445.png)

クライアント側にファイルがコピーされていることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/fa2feabb-6f1f-4480-9195-21fe5d5a93a7.png)


コマンドを再実行すると既にファイルがあるのでchanged=0のままでOKになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/c501ccdf-d089-4e91-84ca-b450df0df2f3.png)

ちなみにクライアント側でcp.fileの中身を書き換えた後で
コマンドを再実行するとファイルが上書きされたので冪等性は担保されてるということですね。

# unarchive モジュール

copyモジュールに似ていますが
こちらはAnsibleサーバにあるtar.gzファイルをクライアントにコピーし
展開まで実施してくれるモジュールです。
コピー後のtar.gzファイルは削除して展開後のファイルだけが残ります。

テスト用に圧縮ファイル作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/232c85c7-65d7-4d19-bb40-b200fb330dcd.png)

プレイブックを作成します。

    - hosts: all
      vars:
        sname: /home/test.tar.gz
      tasks:
        - name: ファイルコピーテスト
          unarchive:
            src={{sname}}
            dest=/root

実行すると正常に完了しました。

クライアント側を確認すると /root配下に圧縮ファイルが展開されています。
展開前の圧縮ファイルはありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/0795959e-fa65-47d4-837f-d7612a8a773a.png)

# yum モジュール

yumモジュールは前回にコマンドで実施した通りです。
クライアント側でyumを実行する場合に使用します。
stateを指定することでアンインストールも可能になります。
presentでインストール removedでアンインストール

    - hosts: all
      tasks:
        - name: slインストール
          yum: 
              name=sl
              state=present

名前にバージョンを入れていない場合は最新をインストールすることになるので
コマンド実行時期でバージョンが変わる可能性があります。

yumはdnfにリダイレクトされているのでこちらの記事を参照

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/dnf_module.html#ansible-collections-ansible-builtin-dnf-module

# file モジュール
ファイル、ディレクトリを作成します。
権限や所有者の設定も可能です。

プレイブックを作成します。
ちょっと小細工をやってみたくて１つのプレイブックにまとめてみました。

    - hosts: all
      vars:
        sname: testdir
      tasks:
        - name: ディレクトリ作成
          file:
            path=/root/{{sname}}
            state=directory
            mode=0755
        - name: ファイル作成
          file:
            path=/root/{{sname}}/testfile
            state=touch
            owner=root
            group=root

実行してクライアントを確認するとディレクトリとファイルが作成されていることが
確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/ab5bab22-a6d6-4fe7-b684-ccf55acc96a7.png)

# user モジュール
ユーザーの作成削除編集をすることができます。
パスワードは平文で良くなったみたいなのでとりあえずそのまま作成します。

    - hosts: all
      vars:
        sname: test
      tasks:
        - name: ユーザー作成
          user:
            name={{sname}}
            password=password
            state=present

実行すると結果はOKですがハッシュ化しなさいと怒られます。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/5e275305-8d79-4757-97a4-4ec6a11814c0.png)

ちょっと調べて↓の様に修正してみました。

    - hosts: all
      vars:
        sname: test
        pword: password
      tasks:
        - name: ユーザー作成
          user:
            name={{sname}}
            password={{ pword | password_hash('sha512') }}
            state=present

結果はOKですが非推奨ってでる・・ぐぬぬ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/68988abd-32dd-4460-85c6-2a96604b881c.png)

アカウント自体は作成できておりSSH接続もできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/100fffd2-54f5-44c5-9f47-8bf4939c3a2b.png)

# service モジュール

サービスを開始したり停止したりできます。
検証としてhttpdをインストールして開始するプレイブックを作成します。

    - hosts: all
      vars:
        sname: httpd
      tasks:
        - name: httpインストール
          yum:
            name={{sname}}
            state=present
        - name: serviceスタート
          service:
            name=httpd
            state=started
        - name: FW無効化
          service:
            name=firewalld
            state=stopped

コマンド実行後webブラウザで確認してみると
テストページが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857934/04eff1f2-5297-431a-bad5-124499006203.png)

最初上手く表示できなくて
FW無効化にたどり着くまでちょっと時間かかりました。。


プレイブックの小技が少しありそうなので次回はそのあたりを
試してみたいと思います。

https://qiita.com/starroadkoichi1128/items/2759569f975fa5474031