ライン

ポイント:*

ライン

 はじめに

構成管理ツールAnsibleを試す

 Chefとかは使っていましたけど、Ansibleは初めてでした。
とりあえず試してみて感覚をつかみたいな、と思ったのですが環境を準備するもの大変だったので、MacBook Airに入れて試すことにしました。

 でも買っただけでほぼ使いこなしていない状態のMacBookだったので、前提になる物から入れる必要性がありました。

 Homebrewのインストール

 名前しか知らなかったこのツールを入れることになりました。

$ xcode-select --install

これをターミナルで入れると、ポップアップで「インストール」を選択。使用承諾契約画面に同意して、ちょっと待つ。
気づいたら「ソフトウェアがインストールされました。」となっていました。

…と、文字だけで書くのは後でわからなくなりそうなので、WindowsPCからMacOSにリモート接続できるようにすることにしました。
RD接続っていうんだそうな。そのまんまだけど…。

以前、KVMとか見ていたときにVNC Viewerは入れたはずだけど…。消しちゃったみたいなので再導入。

これでなんとかなるかな。

入ったっぽい。brewというコマンドが使えるようになりました。

ここまで来れば後は使うだけです。
ちょっと、メモが取りにくいので、SSHで接続して利用するようにしました。

 Ansibleで管理してみる

まず、利用バージョンの確認からします。

$ ansible --version
ansible 1.9.4
  configured module search path = None

Mac側でsshで利用するための鍵を準備しておきます。
入力後はエンターで最後まで抜ける。

$ ssh-keygen -t rsa

さて、今回はFreeBSD 10.2のサーバに設定する例を準備しようと思います。
OSは、導入済み。ローカルアカウントは今回利用するもののみを準備しました。

まず、できあがった公開鍵を、導入使用とするサーバのauthorized_keysに加える。
パスワードなしでログインできることを確認する。

この後の要件は、Pythonが導入されていることなので、追加を行います。

# pkg install python
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    5 MiB 922.9kB/s    00:06
Processing entries: 100%
FreeBSD repository update completed. 24632 packages processed.
Updating database digests format: 100%
The following 6 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        python: 2.7_2,2
        python27: 2.7.10_1
        libffi: 3.2.1
        indexinfo: 0.2.3
        gettext-runtime: 0.19.5.1
        python2: 2_3

The process will require 66 MiB more space.
10 MiB to be downloaded.

Proceed with this action? [y/N]: y

それと、sudoも入れるのを忘れていました。

# pkg install sudo
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        sudo: 1.8.14p3

The process will require 3 MiB more space.
796 KiB to be downloaded.

Proceed with this action? [y/N]: y

 こんな感じです。これで接続先側の準備ができた予定です。
残りは、MacOS側に準備するファイルとなります。
ここでは、hostsに192.168.1.233を設定してある前提で進めます。

$ mkdir /usr/local/etc/ansible/
$ cd /usr/local/etc/ansible/
$ vi hosts
$ ansible 192.168.1.233 -m ping -u foo --ask-pass
SSH password:
192.168.1.233 | FAILED >> {
    "failed": true,
    "msg": "/usr/bin/python: not found\n",
    "parsed": false
}

これは想定通りに、FreeBSDのPythonの絶対パスが合わないので、このメッセージが出てきました。
FreeBSDで設定している例を参考に変更していきます。

[freebsd]
192.168.1.233

[freebsd:vars]
  ansible_python_interpreter=/usr/local/bin/python

こんな感じにして再度実施。今度は

192.168.1.233 | success >> {
    "changed": false,
    "ping": "pong"
}

になりました。

では、そろそろ動作させられそうなので、Playbookを作る部分に入ります。
まずは向こう側でsudoができないと困るので、visudoで接続元をパスワードなしで接続できるようにしておきました。

fkimura ALL=(ALL)       NOPASSWD: ALL

こんなイメージで。
次に、test.ymlというyamlなテキストファイルを準備します。
FreeBSDのperl5をいれることで試そうと思います。

---
- hosts: 192.168.1.233
  user: foo
  sudo: yes
  tasks:
     - pkgng: name=perl5 state=present

のようにしました。FreeBSDのpkgはpkgngとすればいいわけです。statusのpresentはインストールの意味です。
この辺りを参照しました。

$ ansible-playbook test.yml

PLAY [192.168.1.233] ***********************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.1.233]

TASK: [pkgng name=perl5 state=present] ****************************************
changed: [192.168.1.233]

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

導入することができました。

さて、ディレクトリ構造を決めて準備を開始することにします。

$ cd /usr/local/etc/ansible
$ mkdir group_vars host_vars roles
$ cd roles
$ mkdir samples
$ cd samples/
$ mkdir defaults files handlers tasks templates vars  meta
$ cd tasks
$ touch main.yml
$ cp -p main.yml ../defaults/
$ cp -p main.yml ../handlers/
$ cp -p main.yml ../meta/
$ cp -p main.yml ../vars/
$ cd /usr/local/etc/ansible/roles
$ cp -pr samples/ common
$ cd /usr/local/etc/ansible/
$ touch site.yml

いくつかのページを参考に、こんなイメージにしました。
【/usr/local/etc/ansible/site.yml】

---
- name: All nodes
  hosts: all
  sudo: yes
  user: foo

  roles:
    - common

しかしながら、最初のファイルが何とも作れない。
1つサイト分を1本で準備してからばらすしかなさそう。
test.example.gr.jp.yml のようなファイルを準備することにしました。
【/usr/local/etc/ansible/test.example.gr.jp.yml】

---
- name: test.example.gr.jp
  hosts: 192.168.2.233
  user: foo
  sudo: yes
  tasks:
#pkg
   - name: install pkgng
     pkgng: name=pkg state=present

   - name: create motd
     template: src=/usr/local/etc/ansible/roles/templates/motd.j2 dest="/etc/motd" owner=root group=wheel mode=0644

### TOOLS ###
   - name: install pkges
     pkgng: name={{ item }} state=present
     with_items:
       - ja-nkf
       - ja-p5-Jcode
       - ja-p5-Text-ChaSen
       - ja-p5-nkf

#vsftpd-ssl
   - name: install vsftpd-ssl
     pkgng: name=vsftpd-ssl state=present
   - name: copy config files
     copy: src=/usr/local/etc/ansible/roles/files/vsftpd.conf dest=/usr/local/etc/vsftpd.conf owner=root group=wheel mode=0644
     copy: src=/usr/local/etc/ansible/roles/files/vsftpd.chroot_list dest=/usr/local/etc/sftpd.chroot_list owner=root group=wheel mode=0644
   - name: vsftpd rc.conf.d config file
     template: src=/usr/local/etc/ansible/roles/templates/vsftpd.rc.conf dest=/etc/rc.conf.d/vsftpd owner=root group=wheel mode=0644
   - name: vsftpd is running, and starts at boot
     service: name=vsftpd state=started

まずは、こんなところから始めてみました。
motdはちょっと長くてうざいので、短めにしてログインする人へのメッセージを更新できるようにファイルを準備しました。
インストールするだけで、デーモンなどが動かない単純なものは、一括で並べました。
最後のvsftpsは、既存の設定ファイルを持ち込みたいので、filesに置いてコピーして配置します。
/etc/rc.confに単純に、開始するための行を書くなら /etc/rc.conf.d以下に書かないでも serviceだけで記述できるのですが、パラメータなどを含めて書きたい場合も多くあるので、統一的に別ファイルにすることにしました。
ntpとかIPフィルタ関連など先に入れてしまいたい物も多いのですが、覚えるまでは順不同でやってみるつもりです。

ちなみに、motd.j2ファイルは

{{ ansible_distribution_version }}
Welcome to {{ ansible_distribution }}!

Hostname: {{ ansible_fqdn }}

のように記載しているだけです。このansible_~という変数にどんなものが入っているかは、

% ansible 192.168.2.233 -m setup

のようにすることで確認できるので、試してみると良いと思います。

…ということで、情報不足でまだ試行錯誤しています。
Chefの方が慣れているので、全部構築できるけど、Ansibleはどうするのがいいのか良く把握できていませんが徐々に完成させてみるつもりです。

【改訂履歴】作成:2015/11/21 更新:2015/11/23
【参考リンク】

(リンク先の編集は準備中です)

Copyright © 1996,1997-2006,2007- by F.Kimura,