巨人の足元でたじlog

そうして言葉を軽んじるから――― 君は私の言葉を聞き逃す

macのvagrantでcentos7.2にansible2をinstallしてplay-book実行するまで

Vagrant メモ (1) – 1Q77 Vagrant メモ (2) – 1Q77

これにしたがってvirtualbox,vagrantをインストールしました。

VirtualBoxVagrantはすでに設定済とします。

VagrantでCentOS7.2を使う。

http://www.vagrantbox.es/

こちらからほしいOSを探してリンクをコピーします
今回はなんとなくCentOS7.2を使ってみようと思うので、それを探します。・

$ vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
$ vagrant init CentOS7.2 # 適当なディレクトリで実行する
$ vagrant up # 起動する
$ vagrant ssh # 接続する

これでCentOSサーバに入れました。

参考: VagrantでCentOS7をインストール - Qiita

一方こんなやり方でもいいみたいです。

$ vagrant init --minimal ubuntu/trusty64 # minimalオプションを付けると設定ファイルが最低限のものだけになる。
$ vagrant up
$ vagrant ssh

参考: VagrantとDockerについて名前しか知らなかったので試した - Qiita

一度取得したOSは追加のプロセスを経ないで立ち上げることができるっぽいですね。
ただ、どちらの方法でも、すでにboxがローカルになければ、セットアップに数十分くらいかかります。(ました。) 直接urlを指定してboxを追加するのは、CentOSでいうrmp、
名前を指定してboxを(追加した後)iした後するのは、yumで管理する的なことだと勝手に思ってます。

その一覧はどうやって見られるのでしょうか。

$ vagrant box list
centos6   (virtualbox, 0)
centos7.2 (virtualbox, 0)

ではこのOSたちはどこに保存されているのでしょうか。 標準では/Users/<user>/.vagrant.d/boxesの下に配置されるようです。

$ pwd
/Users/<user>/.vagrant.d/boxes
$ tree -s
.
├── [         96]  centos6
│   └── [         96]  0
│       └── [        192]  virtualbox
│           ├── [        258]  Vagrantfile
│           ├── [      11372]  box.ovf
│           ├── [         26]  metadata.json
│           └── [  423996416]  packer-centos-6.5-x86_64-disk1.vmdk
└── [         96]  centos7.2
    └── [         96]  0
        └── [        192]  virtualbox
            ├── [        258]  Vagrantfile
            ├── [      12065]  box.ovf
            ├── [  650415104]  centos-vm-disk1.vmdk
            └── [         26]  metadata.json

確かにCentOSと思しき容量大きいファイルが存在しました。これらしいですね。

さて、今からansibleを使って一方のサーバーからもう一方のサーバーに処理を流したいので、sshで接続する必要があります。
IPアドレスはどうなっているのでしょうか。 デフォルトではプライベートIPの設定はできていないみたいなので、Vagrantfileを弄る必要があります。

# 以下のように設定
config.vm.network :private_network, ip: "192.168.33.10"

編集後、vagrantを再起動します。
$ vagrant reload
で再起動します。

同様にして同じ構成のサーバーをansibledというディレクトリの中に作ります。
ただしプライベートIPアドレスは192.168.33.11としておきます。

CentOSにansibleをinstallする

ansible用サーバーにて

# yum install epel-release # epelレポジトリを追加
# yum install ansible --enablerepo=epel-testing # ansibleをinstall
# ansible --version # versionを確認
ansible 2.4.2.0

enablerepo=epel-testingにしないと、古いversionのansibleがinstallされてしまうということがあるみたいです。(検証してないですが、)

ansibleで構成管理をする

早速ansibleで変更を流してみましょう。
まずは疎通確認から。

ansible 192.168.33.11 -m ping
[WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Could not match supplied host pattern, ignoring: 192.168.33.11

 [WARNING]: No hosts matched, nothing to do

おっとこれは早漏でした。
受ける側の設定を何もしていなかったです。
いくら同じネットワーク内だからといって、無許可で流されたらたまったもんじゃないですね。
結局sshで接続することになるので、sshのconfigあたりを設定変更すればいけそうですね。
と思ったら、その前にansible側でもhostの情報を書かないとだめらしいです。
$ vi /etc/ansible/hostsここにホスト情報を追加します。 さて今一度疎通確認をしてみる。(受け側の設定何も変えてないのでだめだと思うが。)

# ansible 192.168.33.11 -m ping
The authenticity of host '192.168.33.11 (192.168.33.11)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes
192.168.33.11 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
    "unreachable": true
}

案の定だめでした。認証の部分で失敗しましたね。
認証方法は色々ありますが、今回はansible側の公開鍵を受け側に登録しておくことにします。
ansibleサーバにて

# vagrantユーザーで実行する
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): # 特に何も入力しないでEnterする
Enter passphrase (empty for no passphrase): # 特に何も入力しないでEnterする
Enter same passphrase again: # 特に何も入力しないでEnterする
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
6f:9d:ed:39:06:75:70:9b:ff:c0:71:51:ff:00:8a:dc vagrant@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|            .   o|
|       . o . ...o|
|        o E   .o=|
|              o++|
|        S    o +o|
|         . ..oo .|
|          o o....|
|         .   .o..|
|             .o. |
+-----------------+

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsUSJIsKgxiOiFxh2obSw0RCOmODtyyFS60qr1/phQa35sDJwjcoy1kpBdLvIFeQZiWVmKU+vuz1lNjWekKvSOPmxmW54LAJSnqBpy4JgIXzRrm7kEEi0Ol9rkSG3LShtC89CXqOm+PVgXXXXXXXXXXXXXXXXXXXXXXXXXX0Hj+wBTUYrcvQZ7RDAYA1FQeav0Hj+wBTXXXXXXXXXXXXXXXXXXXXXXXXDAYA1FQeav0HnL1CAnseZtBdxXewh/0A9MU9kygj5G3E1j0ZG0q6l9Pt vagrant@localhost.localdomain

# これをコピっとく

受けサーバ側

$ vi ~/.ssh/authorized_keys

# 先程コピーした公開鍵を追加する

これにて完了です。
それでは満を持して疎通確認。

$ ansible 192.168.33.11 -m ping
192.168.33.11 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

OKなようです。
ということは、普通にssh接続もできるということですね。

$ ssh -i ~/.ssh/id_rsa vagrant@192.168.33.11
The authenticity of host '192.168.33.11 (192.168.33.11)' can't be established.
ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts.
Last login: Fri Jan  5 19:42:58 2018 from 10.0.2.2

入れました。

さてここからがansibleの出番です。

ansibleのplaybookを作成してみます。 slコマンドをyumでinstallするだけのplaybookとします。
yum.yml

- hosts: all
  tasks:
    - name: slコマンドのyumインストール
      yum: name=sl
$ ansible-playbook yum.yml

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

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

TASK [slコマンドのyumインストール] *****************************************************************************
fatal: [192.168.33.11]: FAILED! => {"changed": false, "msg": "You need to be root to perform this command.\n", "rc": 1, "results": ["Loaded plugins: fastestmirror\n"]}
    to retry, use: --limit @/home/vagrant/yum.retry

PLAY RECAP ******************************************************************************************
192.168.33.11              : ok=1    changed=0    unreachable=0    failed=1

おっと、yumはrootじゃないと使えないみたいです。
sudo: yesを書き加えるだけでいいみたいです。

- hosts: all
  sudo: yes
  tasks:
    - name: slコマンドのyumインストール
      yum: name=sl

さて、いざ実行

$ ansible-playbook yum.yml
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method
 is 'sudo' (default). This 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] ******************************************************************************
ok: [192.168.33.11]

TASK [slコマンドのyumインストール] *****************************************************************************
changed: [192.168.33.11]

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

OKっぽいですね。
実際に受け側のサーバーで確認してみます。






                  (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @
             (   )
         (@@@@)
      (    )

    (@@@)
 ====        ________                ___________
_|  |_______/        \__I_I_____===__|_________|
_)---  |   H\________/ |   |        =|___ ___|      _________________
    |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
    |  |   H  |__--------------------| [___] |   =|                        |
_______|___H__/__|_____/[][]~\_______|       |   -|                        |
|   |-----------I_____I [][] []  D   |=======|____|________________________|_
| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
      \O=====O=====O=====O_/      \_/               \_/   \_/    \_/   \_/



ちゃんとシュポってますね。

ということで、一旦ansible導入は一区切りつけたいと思います。

次回はplaybookのroleとかの使い分けを整理していきたいです。