とりあえずのansibleサーバ構築～実行まで

## ansibleサーバ構築

- 概要

```
▼ansibleサーバ
OS : CentOS7
IP : 192.168.119.20

▼ansibleクライアント
OS : CentOS7
IP : 192.168.119.21
```

- 最新化

```sh
yum update
```

- SElinuxの無効化

```sh
# getenforce 
Enforcing

# vi /etc/selinux/config
SELINUX=disabled

# reboot

# getenforce
Disabled
```

- firewallの無効化

```sh
systemctl stop firewalld
systemctl disable firewalld
```

- ansibleユーザの作成

```sh
useradd ansible
```

- sudo 許可ユーザに設定

```sh
visudo
==========
追加
# User rules for ansible
ansible ALL=(ALL) NOPASSWD:ALL
==========
```

- 公開鍵認証を作成

```sh
su - ansible
mkdir /home/ansible/.ssh
cd /home/ansible/.ssh
ssh-keygen -t rsa
==========
Enter file in which to save the key (/home/ansible/.ssh/id_rsa): [enter]
Enter passphrase (empty for no passphrase): [enter]
Enter same passphrase again: [enter]
==========
chmod 700 /home/ansible/.ssh
chown -R ansible:ansible /home/ansible/.ssh
```

- epelインストール

```sh
sudo yum install epel-release
```

- ansibleインストール(最新)

```sh
sudo yum install ansible --enablerepo=epel
```

- ansibleインストール(バージョン指定)

```sh
sudo pip install ansible\==2.4.3
```
※こちらでインストールすると `/etc/ansible` は自動生成されない

- バージョン確認

```sh
$ 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 = /usr/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クライアントの設定

- ユーザの作成

```sh
useradd ansible
```

- sudo 許可ユーザに設定

```sh
visudo
==========
追加
# User rules for ansible
ansible ALL=(ALL) NOPASSWD:ALL
==========
```

- サーバ側から公開鍵の転送

```sh
scp /home/ansible/.ssh/id_rsa.pub user@192.168.119.21:/var/tmp
```

- 公開鍵認証を作成

```sh
su - ansible
mkdir /home/ansible/.ssh
cd /home/ansible/.ssh
mv /var/tmp/id_rsa.pub /home/ansible/.ssh/id_rsa.pub
mv id_rsa.pub authorized_keys
chmod 700 /home/ansible/.ssh
chmod 600 /home/ansible/.ssh/authorized_keys
chown -R ansible:ansible /home/ansible/.ssh
```

- [ansibleサーバ]ログインできることの確認

```sh
ssh ansible@192.168.119.21
```

## ansibleサーバ上で設定ファイルの変更

- [ansibleサーバ]管理対象ホストの変更

```sh
# /etc/ansible配下の権限を変更
chown -R ansible:ansible /etc/ansible
su - ansible

# デフォルトのファイルを退避
cp -a /etc/ansible/hosts{,.old}

# ファイルの中身を空にする
:> /etc/ansible/hosts

# /etc/ansible/hosts に ansibleクライアントのIPアドレスの記載
vi /etc/ansible/hosts
==========
[ansible_client]
192.168.119.21
==========
```

```sh
# 疎通確認
ansible -m ping ansible_client
==========
192.168.119.21 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
==========
```

#### これでサーバをクライアントの疎通までできました。

## 簡単にクライアントの設定を変更

- [ansibleサーバ]クライアントの設定変更内容を記載

内容は、firewallの停止を行う命令文を記載しました。

```sh
touch /etc/ansible/roles/ansible_client_setup.yml
vi /etc/ansible/roles/ansible_client_setup.yml
==========
---
- hosts: ansible_client
  become: true
  tasks:
    - name: service firewalld stop
      service: name=firewalld state=stopped
==========
```

- [ansibleクライアント]firewallの起動を確認

```sh
service firewalld status
==========
Redirecting to /bin/systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2020-08-31 19:16:38 JST; 19h ago
     Docs: man:firewalld(1)
 Main PID: 679 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─679 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

 8月 31 19:16:37 ansible_client systemd[1]: Starting firewalld - dynamic firewall daemon...
 8月 31 19:16:38 ansible_client systemd[1]: Started firewalld - dynamic firewall daemon.
 8月 31 19:16:39 ansible_client firewalld[679]: WARNING: AllowZoneDrifting is enabled. This is considered an ...now.
Hint: Some lines were ellipsized, use -l to show in full.
==========
```

- [ansibleサーバ]クライアントの設定をansibleから変更

```sh
cd /etc/ansible
ansible-playbook -i hosts roles/ansible_client_setup.yml
==========
PLAY [ansible_client] ***********************************************************************************************

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

TASK [service firewalld stop] ***********************************************************************************
changed: [192.168.119.21]

PLAY RECAP **********************************************************************************************************
192.168.119.21             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
==========
changed=1 になったので、変更がされました！
```

- [ansibleクライアント]firewallの停止を確認

```sh
service firewalld status
==========
Redirecting to /bin/systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

 8月 31 19:16:37 ansible_client systemd[1]: Starting firewalld - dynamic firewall daemon...
 8月 31 19:16:38 ansible_client systemd[1]: Started firewalld - dynamic firewall daemon.
 8月 31 19:16:39 ansible_client firewalld[679]: WARNING: AllowZoneDrifting is enabled. This is considered an ...now.
 9月 01 15:07:36 ansible_client systemd[1]: Stopping firewalld - dynamic firewall daemon...
 9月 01 15:07:37 ansible_client systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
==========
```

きちんと止まっていることが確認できました！

## ちなみに2回目実行したら...?

- [ansibleサーバ]同じ設定ファイルでクライアントの環境を変えずにansibleを再度実行

```sh
cd /etc/ansible
ansible-playbook -i hosts roles/ansible_client_setup.yml
==========
PLAY [ansible_client] ***********************************************************************************************************************************************************************************************************************

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

TASK [Turn off firewalld service] ***********************************************************************************************************************************************************************************************************
ok: [192.168.119.21]

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
192.168.119.21             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
==========
すでにクライアント側のfirewallは停止状態にあるので、changeはされずにそのまま終わりました。
```

## 実行する際に躓いたところ

- sudo権限

```
firewallの停止などミドルウェアの停止はsudo権限が必要になります。
sudo権限をつけるためには、/etc/ansible/roles/ansible_client_setup.yml
==========
become: true
==========
を、書いていないとansibleユーザでsudoなしで実行しているので、以下のようにタイムアウトとなってしまいます。
```


```sh
ansible-playbook -i hosts roles/ansible_client_setup.yml

PLAY [ansible_client] ***********************************************************************************************

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

TASK [service firewalld stop] ***********************************************************************************
fatal: [192.168.119.21]: FAILED! => {"changed": false, "msg": "Unable to disable service firewalld: Failed to execute operation: 接続がタイムアウトしました\n"}

PLAY RECAP **********************************************************************************************************
192.168.119.21             : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
```


## 参考

- [sudoの設定ファイルsudoersについて](https://tech.unifa-e.com/entry/2018/05/18/112810)
- [Ansible で sudo を実行する](https://medium.com/makotows-blog/ansible-%E3%81%A7-sudo-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-bf7075c6feb0)
- [Ansible勉強メモ(CentOS7セットアップ #1)](https://qiita.com/hhayashi/items/233d6706aab3df373b78)
- [ansible インストール](https://www.tanchallenge-glory40.com/ansible_install/)
- [既存のファイルを空にするLinuxコマンド](https://qiita.com/nabewata07/items/e67d008a1f10429bb3bf)
- [Ansibleのバージョンを指定してインストールする](https://www.kabegiwablog.com/entry/2018/05/02/100000)