Ansible入門① インストールからansible-playbookコマンドの実行

#Ansibleの良いところ
- 構成を管理する対象のサーバー側にソフトウェアのインストールが不要でエージェントレス
- 設定ファイルがYAMLでの表記で、可読性が非常にメンテナンスコストも低い
- YAMLは学習コストが非常に低い

[YAML](https://ja.wikipedia.org/wiki/YAML)

#キーワード
厳密な説明ではないですが、ざっくりイメージを掴むために最低限必要なものだけ列挙しています。
###ノード
サーバーやクライアント等のことです。
###インベントリ
INI形式もしくはYAML形式でターゲットノード(構成を管理する対象のサーバー)の接続情報
1つまたは複数のノードの管理に利用し、グループ化することも可能です。
###モジュール
Ansibleがリモートマシンに送信する作業の単位です。
標準で提供されているモジュールがあり、基本はそのモジュールを組み合わせで構成管理を行います。
Linuxのコマンドに近いイメージのモジュールもたくさんあります。
独自でモジュールを作成することも可能です。
###タスク
実行するモジュールや、モジュール実行時に必要な引数などを纏めた処理の定義情報または処理そのものをさします。
###プレイブック
タスクを纏めたものです。

#検証環境(Ansibleのインストール先のサーバー)
```
CentOS Linux release 7.8.2003 (Core)
```

#ansible.cfg
Ansibleそのものの設定ファイルで、yumでインストールした場合は、
/etc/ansible/ansible.cfgが自動で作成される
そのため、手っ取り早く動作を検証したい場合は、yumでのインストールをお勧めします。

#インストール
下記の方法が最も簡単ですが、その他にもpipを利用したインストル方法やソースからのインストール方法等があります。
[Ansible のインストール](https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#rhelcentos-fedora-ansible)

```
epel リポジトリを追加
# yum install epel-release
インストール
# yum install ansible
```

#バージョン確認

```
[root@localhost ansible]# ansible --version
ansible 2.9.10
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```

#鍵認証用の設定
Ansibleでの管理対象のサーバーへ鍵認証の設定を事前に行っておく必要があります。
接続元サーバー(今回の場合はAnsibleをインストールするサーバー)で鍵を作成します。
作成したサーバーの公開鍵を管理対象のサーバーに設定します。
 [ssh公開鍵認証を実装する](https://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)

#ansibleコマンド
ansible -i インベントリファイル -m 利用するモジュール

```
[root@localhost ansible]# cat /etc/ansible/test_inventory
[test_servers]
192.168.11.21

[root@localhost ansible]# ansible -i test_inventory test_servers -m ping
192.168.11.21 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
```

#ansible-playbookコマンド
ansible-playbook -i インベントリファイル プレイブックファイル

```
#/opt/tmpディレクトリの作成と/etc/ansible/test_inventoryファイルのコピーを実施する
[root@localhost ansible]# cat test_playbook.yml
- hosts: test_servers
  tasks:
  - name: create direvtory
    file:
       path: /opt/tmp
       state: directory
       owner: ansible
       mode: 0755

  - name: copy file
    copy:
       src: /etc/ansible/test_inventory
       dest: /home/ansible/tmp/test_inventory
       owner: ansible
       mode: 0644


#Taskが成功し、ディレクトリの作成とファイルのコピーが成功しているので、ok=3    changed=2となっている 
[root@localhost ansible]# ansible-playbook -i ./test_inventory ./test_playbook.yml

PLAY [test_servers] ***************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************
ok: [192.168.11.21]

TASK [create direvtory] ***********************************************************************************************************************
changed: [192.168.11.21]

TASK [copy file] ******************************************************************************************************************************
changed: [192.168.11.21]

PLAY RECAP ************************************************************************************************************************************
192.168.11.21              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


#test_playbook.ymlを連続して実行した場合は、状態に変化ないのでchanged=0となっている
[root@localhost ansible]# ansible-playbook -i ./test_inventory ./test_playbook.yml

PLAY [test_servers] ***************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************
ok: [192.168.11.21]

TASK [create direvtory] ***********************************************************************************************************************
ok: [192.168.11.21]

TASK [copy file] ******************************************************************************************************************************
ok: [192.168.11.21]

PLAY RECAP ************************************************************************************************************************************
192.168.11.21              : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```