Ansibleを少し使ってみて雰囲気をつかむ


AnsibleはRed Hatが開発するオープンソースの構成管理ツールです。

最近、Terraformのremote-execなどを調べていたのですが、仮想マシンの作成時にしか実行されないとのことで、構築後の運用ではやはりAnsibleが選択肢の一つとなります。Ansibleは多機能なツールですが、この記事では雰囲気をつかむために、ごく簡単に実行した内容をまとめておきます。

図にするほどでもないがやっていること：
![ansible1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/4de48d01-f295-53c6-6567-a349ae1d71b6.png)

# 1) 鍵の作成

仮想マシンに設置するための鍵を作成しておきます。既存の鍵を使う場合は省略して下さい。

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/ubuntu/.ssh/id_rsa): /ubuntu/ansible-key/id_rsa
Enter passphrase (empty for no passphrase):    ※パスフレーズを入力※
Enter same passphrase again:                   ※パスフレーズを入力※
※出力は省略※
$ ls -l ~/ansible-key
total 8
-rw------- 1 root root 1766 Oct 23 06:35 id_rsa       ※秘密鍵※
-rw-r--r-- 1 root root  403 Oct 23 06:35 id_rsa.pub   ※公開鍵※
# cat ~/ansible-key/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ubuntu@localhost    ※以降の手順でこの鍵を設定※
```

# 2) 公開鍵の設定

管理対象端末で、ansible-userを作成して 1)の公開鍵を設定します。

```
# adduser ansible-user
Adding user `ansible-user' ...
Adding new group `ansible-user' (1002) ...
Adding new user `ansible-user' (1002) with group `ansible-user' ...
Creating home directory `/home/ansible-user' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:       ※パスワードを入力※
Retype new UNIX password:      ※パスワードをもう一度入力※
passwd: password updated successfully
Changing the user information for ansible-user
Enter the new value, or press ENTER for the default
        Full Name []:       ※ENTERで進む※
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y       ※Yを入力※

# su - ansible-user
$ mkdir .ssh
$ chmod 700 .ssh
$ vi id_rsa.pub       ※1)で作成したid_rsa.pubと同じ内容にする※
$ cat id_rsa.pub >> authorized_keys
```

# 3) Ansible設定

コントロールする側(サーバ側)で設定を行います。

Ansibleインストール：

```
# apt install -y ansible
※出力は省略※

# ansible --version
ansible 2.5.1
  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/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15+ (default, Jul  9 2019, 16:51:35) [GCC 7.4.0]
```

/etc/ansible/hosts設定：管理対象端末のIPアドレスを設定します。

```
# cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.
[pracice]
10.0.3.100       ※管理対象端末のIPアドレスを設定※

#green.example.com
```

1)の秘密鍵を設置して、ansible pingコマンドで接続確認します。

```
# ls -l /home/azureuser/.ssh/ansible.id_rsa
-rw-------  1 root root 1767 Oct 21 02:57 ansible.id_rsa    ※1)の秘密鍵、パーミッションを600に設定※

# ansible 10.0.3.100 -m ping -u ansible-user --private-key=/home/azureuser/.ssh/ansible.id_rsa
Enter passphrase for key '/home/azureuser/.ssh/ansible.id_rsa':    ※パスフレーズを入力※
10.0.3.100 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

管理対象端末の構成(実行する内容)を記載したplaybookを準備します。ここではテスト用のディレクトリを作成するだけの内容です。

```
# cat playbook.yml
- hosts: all
  sudo: false
  tasks:
    - name: mkdir test
      file: dest=/home/ansible-user/test_directory/ state=directory
```

ansible-playbookコマンドを実行します。playbookに記載した内容が管理対象端末で実行されます。

```
# ansible-playbook playbook.yml -u ansible-user --private-key=/home/azureuser/.ssh/ansible.id_rsa
feature will be removed in version 2.6. Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
Enter passphrase for key '/home/azureuser/.ssh/ansible.id_rsa':    ※パスフレーズを入力※
ok: [10.0.3.100]

TASK [mkdir test] **************************************************************************************************************
changed: [10.0.3.100]

PLAY RECAP *********************************************************************************************************************
10.0.3.100              : ok=2    changed=1    unreachable=0    failed=0
```

エラーが出ていないことを確認し、管理対象で結果を確認します。

```
$ ls -l /home/ansible-user/test_directory
drwxrwxr-x 2 ansible-user ansible-user 4096 Oct 21 12:19 test_directory/
```

ごくごく簡単ですが手順は以上です。