Chefとかは使っていましたけど、Ansibleは初めてでした。
とりあえず試してみて感覚をつかみたいな、と思ったのですが環境を準備するもの大変だったので、MacBook Airに入れて試すことにしました。
でも買っただけでほぼ使いこなしていない状態のMacBookだったので、前提になる物から入れる必要性がありました。
名前しか知らなかったこのツールを入れることになりました。
$ xcode-select --install
これをターミナルで入れると、ポップアップで「インストール」を選択。使用承諾契約画面に同意して、ちょっと待つ。
気づいたら「ソフトウェアがインストールされました。」となっていました。
…と、文字だけで書くのは後でわからなくなりそうなので、WindowsPCからMacOSにリモート接続できるようにすることにしました。
RD接続っていうんだそうな。そのまんまだけど…。
以前、KVMとか見ていたときにVNC Viewerは入れたはずだけど…。消しちゃったみたいなので再導入。
これでなんとかなるかな。
入ったっぽい。brewというコマンドが使えるようになりました。
ここまで来れば後は使うだけです。
ちょっと、メモが取りにくいので、SSHで接続して利用するようにしました。
まず、利用バージョンの確認からします。
$ 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
【参考リンク】
(リンク先の編集は準備中です)
design テンプレート