初心者のAnsible導入～サーバ構築からplaybook作成まで～

#本記事で行うこと
今回は自分用のメモと初心者向けの内容となる。やることはVirtualboxでのCentOSサーバ構築とAnsibleの導入、簡単なplaybook作成までを行う。ぶっちゃけplaybook作成だけならほかに優良な記事がたくさんあるが、一からやるときに色んなサイトをあさるのがめんどいのでここに記載する。
サーバ構築については細かい手順を書くつもりはなく、自分が詰まった設定について記載する。
#環境
今回は以下環境で構築を行う。
・ Windows10
・ [Virtualbox](https://www.virtualbox.org/)-6.0.2
・ [CentOS](https://www.centos.org/)-7.0.1810 
・ ansible-2.7.10
##Virtualbox設定
virtualbox自体のインストールについては省略する。
まず仮想マシン作成の前にホストオンリーアダプタの設定を行う。virtualboxを起動して「ホストネットワークマネージャ」を起動する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/796e0471-a8de-8d12-3cbe-e44d342e7ff1.png)

以下記事を参考にホストオンリーアダプタの設定を行う。
####参考
[virtualboxでホストオンリーアダプターを利用して、SSH接続を行う｜Windows10](https://qiita.com/koki276/items/28a87eb06abb4d8b5e13)


##CentOSサーバの構築
設定が終わったら仮想マシンを新規作成⇒CentOSのISOイメージを読み込ませてインストールを行う。この時にGUI上でいろいろと細かい設定はできるが、今回はrootユーザのPASSWORD設定のみを行う。

インストールが完了するとOS再起動を行いログイン画面になる。一旦電源を落としVirtualBoxの画面にもどる。
設定でネットワークをアダプター1をNAT、アダプター2を有効化しホストオンリーアダプターを設定する。
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/40cca405-6483-4c88-1c3d-41e2028057a4.png)
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/38431233-e49c-dde3-13ca-4351729d7fe6.png)

VirtuslBOXからサーバを起動、rootでログインする。

サーバホスト名を変更する。

```Linux:server
$ hostnamectl set-hostname ansible
```

一度ログアウトして再度ログインするとホスト名が変更されている。
次にネットワーク設定を行う。ぶっちゃけnmtuiコマンドでGUIでやったほうがわかりやすいが、試しにコマンドで設定を行ってみる。

```Linux:server
[root@ansible ~]# nmcli
enp0s8: connected to ■ ■ ■ ■ 1
        "Intel 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter)
        ethernet (e1000), 08:00:27:BD:A1:C1, hw, mtu 1500
        inet4 192.168.251.3/24
        route4 192.168.251.0/24
        inet6 fe80::d347:bad1:cb5d:79a4/64
        route6 ff00::/8
        route6 fe80::/64
        route6 fe80::/64

enp0s3: disconnected
        "Intel 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter)
        1 connection available
        ethernet (e1000), 08:00:27:46:40:A9, hw, mtu 1500
```

enp0s3がNAT、enp0s8がホストオンリーアダプターのインターフェースである。
CentOS7 NIC命名規則などで調べればいろいろわかるが、末尾の数が若いほうがアダプター1、次が2という感じになる。

文字化けしているのはインターフェース名が日本語になっているからである。

enp0s3についてインターフェースを起動し、自動起動設定をオンにする。

```Linux:server
[root@ansible ~]# nmcli c m enp0s3 connectuon.autoconnect yes
[root@ansible ~]# nmcli c u enp0s3 
```
次にホストオンリーアダプターのインターフェースについて設定を行う。

```Linux:server
[root@ansible ~]# nmcli c modify enp0s8 ipv4.addresses 192.168.251.3/24
[root@ansible ~]# nmcli c modify enp0s8 ipv4.method manual
```

enp0s8のIP割り当てを手動にし、「192.168.251.3/24」を割り当てた。
割り当てるIPは事前に設定したホストオンリーアダプターのネットワーク帯のものを割り当てる。

設定が終わったらTeratermでホストオンリーアダプターのIP（この記事だと192.168.251.3)にアクセスし、nmcliコマンドでインターフェースがすべて起動していることを確認する。

これでインターネットに接続できるようになったので、早速Ansibleをインストールする。

```Linux:server
[root@ansible ~]# yum -y install ansible
```

インストールされたことを確認するために以下コマンドを実行する。

```Linux:server
[root@ansible ~]# ansible --version
ansible 2.4.2.0
  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 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
```

どうやら正しくインストールされたみたいだ。

##Playbookの作成

Ansibleの設定を行っていく。
Ansibleの詳細については公式ドキュメントや下記記事を参照されたい。

[AnsibleによるInfrastructure as code入門 ( @kk_Ataka )]
(https://www.slideshare.net/kk_Ataka/ansibleinfrastructure-as-code)

今回はSTEP1としてplaybookを作成して他サーバ上でコマンド実行をしてみようと思う。

テスト環境は以下とする。
・Ansibleサーバ
・test1サーバ(CentOS7)
・test2サーバ(CentOS7)

test1,2サーバについてはipをそれぞれ「192.168.251.4」、「192.168.251.5」を与えた。

Ansibleはエージェントに対してSSH接続を行うのでsshkeyの作成、sshkeyのコピーを行う

```Linux:server_Ansible
[root@ansible ~]# ssh-keygen -t rsa
パスワード入力を求められるのでなにも入れずにEnter
[root@ansible ~]# ssh-copy-id root@192.168.251.4
処理を続行しても良いか問われるのでyesを選択、接続サーバのrootパスワードを入力
同様に
[root@ansible ~]# ssh-copy-id root@192.168.251.4
```

これで下準備は整ったので、まず対象ホストをまとめたhostsファイルを作る。

```Linux:server_Ansible
[root@ansible ~]# mkdir ansible
[root@ansible ~]# cd ansible
[root@ansible ansible]# mkdir inventory
[root@ansible ansible]## vi inventory/hosts

[targets]
192.168.251.4
192.168.251.5
```

targetsグループに「192.168.251.4」、「192.168.251.5」を所属させる。
先ほど行った設定に問題がないか確認する。

```Linux:server_Ansible
[root@ansible ~]# ansible all -i hosts/hosts -m ping
192.168.251.5 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.251.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

うまくいったようだ。

準備が長くなってしまったが次にPlaybookを作成してtestサーバにrubyをインストールしてみる。
ansibleフォルダ配下にgroup_varsフォルダを作成してそこにplaybookを作成する。

```Linux:server_Ansible
[root@ansible ansible]#mkdir group_vars
[root@ansible ansible]#vi group_vars/ruby.yml
```

```yml:ruby.yml
- hosts: target
  tasks:
    - name: packages install from yum
      yum:
        name: ruby 
        state: latest
```

ymlファイルの中身だがhostsには対象サーバ、tasksのnameはこのplaybookがなにをするものかを書いてある。nameを変数にすれば複数インストールや用途を別にして応用が利くようになる。

いざ実行！

```Linux:server
[root@ansible ansible]# ansible-playbook -i inventory/hosts group_vars/ruby.yml 
```

ここで少しはまったのがhostsとymlの指定方法である。
ファイルの指定方法は自分がいるディレクトリからのパスで指定する。上記の場合だと自分が今いるディレクトリの配下にあるファイルを使っているので上のようなコマンドになるが例えばgroup_varsで実行しようとした場合以下のようになる。

```Linux:server
[root@ansible ansible]# ansible-playbook -i ../inventory/hosts ruby.yml 
```

実行後エラーなく終われば完了、ためしにサーバ上で確認してみる

```Linux:server
[root@test2 ~]# yum list installed | grep ruby
ruby.x86_64                             2.0.0.648-35.el7_6             @updates
ruby-irb.noarch                         2.0.0.648-35.el7_6             @updates
ruby-libs.x86_64                        2.0.0.648-35.el7_6             @updates
rubygem-bigdecimal.x86_64               1.2.0-35.el7_6                 @updates
rubygem-io-console.x86_64               0.4.2-35.el7_6                 @updates
rubygem-json.x86_64                     1.7.7-35.el7_6                 @updates
rubygem-psych.x86_64                    2.0.0-35.el7_6                 @updates
rubygem-rdoc.noarch                     4.0.0-35.el7_6                 @updates
rubygems.noarch                         2.0.14.1-35.el7_6              @updates
```
問題なくインストールできている。

後半駆け足になってしまったがとりあえず基礎的なものには触ることができた。
次回でAnsibleを使って複数サーバの情報取得をやってみようと思う。