11月 112014
 

こんばんは。ファガイです。
本日は構成管理ツールのAnsibleを利用しようと思います。

Ansibleって何?

Ansibleとか構成管理ツールのことで、Chef等のツールと大体は同じです。
Chefと比べ、AnsibleはRubyの理解を必要とせず、yaml形式での記述をするため、比較的初心者向けとなっております。
チームで開発したりする際に、ローカル環境を同一にするために使われると思います。

環境

環境は以下となります。出来るだけ最新の環境で試します。

  • Windows7
  • Vagrant1.6.5
  • VirtualBox4.3.12
  • Gow0.8.0

なお、参考にしているサイトは、
Ansible チュートリアル
です。

GowはWindowsでlinuxコマンドが打てないため使用しています。

サーバーの準備

チュートリアルの通りにやっていきます。

$ mkdir ansible-tutorial
$ cd ansible-tutorial
$ vagrant init centos6 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box

Vagrantfileを編集します。config.vm.boxの部分を変更。

  config.vm.define :node1 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    node.vm.network :private_network, ip: "192.168.33.11"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "centos6"
    node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
    node.vm.network :private_network, ip: "192.168.33.12"
  end

上記では2台のサーバーを立ち上げるようにしています。1台はAnsibleを動かすサーバーで、もう一台は制御される側のサーバーです。Mac等では、Ansibleを動かすサーバーはMac上で作れるため、制御されるサーバーのみでも行けるはず。

追記

vagrant1.7から秘密鍵を自動生成する方式が追加され、それがデフォルトになってしまった関係で、sshキーを渡しても入れなくなっていました。

なので、vagrant1.7以降の場合は以下も記述する必要があります。

config.ssh.insert_key = false

では、起動。初回はboxのDLが必要なため、時間がかかるかもしれません。

vagrant up

起動が完了したら、node1からnode2へssh出来るようにvagrant用の秘密鍵をコピーします。

$ vagrant ssh-config node1 > ssh_config
$ vagrant ssh-config node2 >> ssh_config
$ scp -F ssh_config ~/.vagrant.d/insecure_private_key node1:.ssh/id_rsa

なお、scpコマンドは通常入ってないため、Git Bash等から叩きましょう。
では、sshで接続をしてみましょう。

$ vagrant ssh node1
$ vagrant ssh node2
The `ssh` executable found in the PATH is a PuTTY Link SSH client.
Vagrant is only compatible with OpenSSH SSH clients. Please install
an OpenSSH SSH client or manually SSH in using your existing client
using the information below.

Host: 127.0.0.1
Port: 2001
Username: vagrant
Private key: C:/Users/fagai336/.vagrant.d/insecure_private_key

多分、上記のようなエラーで入れないかなと思います。入れている方はGitをインストールして、かつコマンドラインへパスを通している方だけかなと思います。

入るためにはGit Bash等から叩くか、sshクライアントを利用することで入ることが可能です。

問題なく入れることが確認できました。

Ansibleのインストール

では、Ansibleのインストールを行います。インストールを行うのはAnsibleを動かすnode1サーバーです。

ここはチュートリアルと異なります。チュートリアルでは問題なくできているようなのですが、どうしてもpythonのインストールに失敗します。(python2.7である必要は無いと思うので)
なので、yumで直接pythonを入れます。

sudo yum install python

ansibleに関してはepelで提供されているため、それを利用します。

sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
sudo yum install ansible

インストールが完了しましたね。既にpythonが入っている方はpipでのインストールで良いかと思います。

Ansibleが問題なく動くか確認

ansibleからnode2に対してpingを飛ばしてみましょう。

$ ansible 192.168.33.12 -m ping
 [WARNING]: The version of gmp you have installed has a known issue regarding
timing vulnerabilities when used with pycrypto. If possible, you should update
it (ie. yum update gmp).

No hosts matched

こんな感じになるかなと思います。
gmpをupdateしろーとか書かれているんですが、実行しても最終バージョンなので、このエラーは放置。とりあえずチュートリアルに書いてある内容をやります。

とりあえずカレントディレクトリにhostsファイルを作成します。

$ cd
$ echo 192.168.33.12 > hosts

では、iオプションを付けて、pingを実行します。

$ ansible -i hosts 192.168.33.12 -m ping
 [WARNING]: The version of gmp you have installed has a known issue regarding
timing vulnerabilities when used with pycrypto. If possible, you should update
it (ie. yum update gmp).


paramiko: The authenticity of host '192.168.33.12' can't be established.
The ssh-rsa key fingerprint is c44df90509313305cd99525bfce010b5.
Are you sure you want to continue connecting (yes/no)?
yes
192.168.33.12 | success >> {
    "changed": false,
    "ping": "pong"
}

warningは出てますが、一応疎通出来ました。

Playbookを書いてみる

Playbookとは、構築するサーバーの構成内容を記述したものです。Chefでいうレシピのことです。

記述はyaml形式で記述します。インストールするパッケージや項目をtasks:の項目に記述することで、記述された処理を実行していきます。

Windowsから管理出来るよう、/vagrantディレクトリ上で作業を行いましょう。
hostsファイルをこのタイミングで変更しておきます。

カレントディレクトリのhostsファイルを以下に変更します。

[test-servers]
192.168.33.12

ansibleでは、host単位で構築の実行が出来ます。上記のように書いておくことで、test-serversに適用するplaybook、develop-serversに適用するplaybook等、振り分けが可能になります。

では、サンプルとして、pingを実行するだけのsample.ymlというファイルを作成します。

- hosts: test-servers
  sudo: yes
  tasks:
    - name: pingのチェック
      action: ping

ymlに関しては以下の記事が参考になります。

ansible使いのためのYAML入門

なお、タスク名には日本語が使えるので楽ですね。

軽く解説すると、

  • hostsは対象のサーバーのホストを指定します。
  • sudoはsudoコマンドで実行するかどうか
  • tasksが実行する処理です。nameがタスク名で、actionが処理内容です。

なお、他にも色々記述出来るみたいです。
taskには今回actionという指定をしていますが、All Modules - Ansible Documentationに記載されているものであれば使用することが出来るようです。

詳しい話は以下の公式ドキュメントに書かれていそうです。

Playbooks - Ansible Documentation

ymlが間違えてないか確認をする

では、先程作ったsample.ymlに間違いが無いかチェックをしましょう。

まずは、構文チェックの--syntax-check。

$ ansible-playbook -i ~/hosts sample.yml --syntax-check
playbook: sample.yml

上記の様に表示されればOKです。(warningは消しました)

次に、--checkオプションで、動作を確認します。checkオプションはインストールなどの変更は行わないが、条件の確認などは実行するオプションです。いわゆるdry runでしょうか。

$ ansible-playbook -i ~/hosts sample.yml --check
PLAY [test-servers] *********************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.12]

TASK: [pingのチェック] ************************************************************* 
ok: [192.168.33.12]

PLAY RECAP ******************************************************************** 
192.168.33.12              : ok=2    changed=0    unreachable=0    failed=0   

問題なく実行させることが出来たようです。
これでOK。

まとめ

Ansibleはちょっと最初の構築が面倒ですが良さそうですね。
余裕があれば次回、LAMP環境を作ってみる記事を書こうと思います。

ではでは。

Pocket

 Posted by at 11:04 PM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*