こんにちは。長野オフィスのバックエンドエンジニア、ヤスタカです。
最近長野での休日の過ごし方がわからなくなってきています。この時期ってなにしたら楽しいの? 山登り?
さて、みなさんはサーバーの環境構築をどのように行っていますか?
手順書を作って、ひとつひとつコマンドを間違えないようにコピペして実行……そんなやり方をしていませんか? それでも起きてしまうのが作業ミス。。
最近では「Infrastructure as a Code」なんて言葉もよく会話にのぼるようになってきました。
- Infrastructure as a Codeとは
- 従来の手順書を元に手動で構築してきたサーバーの環境をコード化すること。これによりサーバー構築の自動化と管理が容易になる。
今回はAnsibleを使って、サーバーの構成管理をコード化してみたいと思います。
Ansibleで何ができるの?
「Ansible」は、ChefやPuppetなどと並んで比較される構成管理ツールのひとつ。Infrastructure as a Codeを実践するための各種機能を提供してくれます。いわゆるConfigurationツールで、ミドルウェアレベルの設定をコード化できます。
他の構成管理ツールと比較したAnsibleの特徴
- 特別なソフトのインストールが必要なく、エージェントレスで使える
- 設定ファイルをYAML形式でシンプルに記述できる
- インストールが容易でシンプルな構成のサーバー群を管理するのに向いている
Ansibleをサーバーへインストールする
それではAnsibleの使い方について見ていきましょう。
前提として、ホストサーバー×1台とwebサーバー×2台の3台構成とします。
ホストサーバー側にはAnsibleをインストールし、ホストサーバー側からwebサーバーを操作して自動で環境構築するようなイメージです。
ホストサーバー・webサーバーともに今回はLinuxを前提とします。
またホストサーバーからwebサーバーにはそれぞれsshでリモートログインできるよう、事前の設定が必要です。
まずはホスト側のサーバーにAnsibleをインストールします。
$ sudo -y yum install epel-release
epelをインストールして、Ansibleがインストールできるようにします。
sudo -y yum install ansible
そしてAnsibleのインストール。これだけでインストールが完了です。簡単でしょ?
sshログインの設定
sshでログインするには、sshの秘密鍵と公開鍵ファイルの作成などが必要です。
今回は新規に鍵を作成する方法を記載しておきます。まず、ホストサーバーのhomeフォルダ直下に.sshというフォルダがあるので、そこにconfigというファイルを作ります。
そこにwebサーバーとなるサーバー2台のIPアドレスを記載します。このIPアドレスは環境に応じて異なるなるので、それぞれのサーバーのIPアドレスを確認して適宜設定してください。
今回は「Host webserver1 HostName 192.168.100.2」 「Host webserver2 HostName 192.168.100.3」と記載して保存します。
最後にconfigファイルのパーミッションを変更します。$ chmod 600 .ssh/config
次に鍵認証を設定します。
鍵認証をするため、ホストサーバーで秘密鍵と公開鍵を作成し、公開鍵をwebサーバー側にコピーします。$ ssh-keygen -t rsa
として、パスフレーズは何も入力せずにリターンを押します。
次に公開鍵をwebサーバー2台にコピーします。
$ ssh-copy-id webserver1 $ ssh-copy-id webserver2
コピーができたら、
$ ssh webserver1
でログインできれば設定完了です。
Inventoryファイルの作成
Ansibleのインストールが完了したら、次にinvetoryファイルを記述します。
Ansibleの設定ファイル群は、デフォルトで/etc/ansible以下に格納されています。その中にhostsというファイルがあると思うので、こちらを編集していきましょう。このファイルをじーっと眺めているとなんとなく書き方がわかってくると思います。
下の例ではホストサーバーは「192.168.100.1」になります。▼/etc/ansible/hosts
192.168.100.1 [webservers] 192.168.100.2 192.168.100.3
その後に[webservers]というグループに所属しているサーバーとして、「192.168.100.2」と「192.168.100.3」という2つのサーバーがあるという構成です。
こうやってグループを作っておくと、そのグループに所属しているサーバーに対して同一の設定をまとめて記述できるという利点があります。
Ansibleコマンドを使ってみる
それではここでAnsibleコマンドを使ってみましょう。
正しく通信できているか、pingというコマンドを全サーバーに対して実行してみたいと思います。▼playbook.yml
$ ansible all -m ping 192.168.100.1 | success >> { "changed": false, "ping": "pong" } 192.168.100.2 | success >> { "changed": false, "ping": "pong" } 192.168.100.3 | success >> { "changed": false, "ping": "pong" }
上のようなレスポンスが返ってくればOKです。
$ ansible all -m ping
というコマンドは、「Ansibleという記述でAnsibleコマンドを使うよ」とまず宣言をして、その後のallは「全サーバーに対して、この後の命令を実行するよ」という意味です。
先ほどのInventoryファイルがここで役立ち、allのところをwebserversとすれば、Inventoryファイルでwebserversグループに設定したサーバーに対してのみ命令が実行されます。最後の-m pingというコマンドは「Ansibleのpingモジュールを使って命令を実行する」という意味。
Ansibleは全てのコマンドをモジュールという形で実行します。Ansibleを操作する上ではこのモジュールを組み合わせて処理を書いていきます。playbookの作成
先ほどは各サーバーに対して直接コマンドを打って処理を実行しましたが、それではInfrastructure as a Codeとは言えません。
このコマンドを「playbook」というYAML形式のファイルにまとめて、コード化していきましょう。そう、このplaybookこそAnsibleの肝とも言える重要なファイルなのです。ではplaybookの記述方法について見ていきましょう。
- hosts: all sudo: yes tasks: - name: add user user: name=lig state=present
hosts:allとすることで全サーバーに対してその下に記述したタスクが実行されます。今回はuserモジュールを使って、サーバーに新たなユーザーを追加するタスクを記述しています。
sudo:yesというのは、「サーバーにログイン後に管理者権限で実行する」という意味です。
その下のtasks:という部分に、実際に実行するモジュール処理を記述します。
tasksの下の-nameでは、タスクの名前を決めます。必須ではないですが、付けておくと「なんの処理をするためのタスクなのか」がひと目でわかります。使用するモジュールはuserで、userモジュールのオプションとしてnameとstateを指定しています。nameで指定するのは追加するユーザー名です。stateはユーザーを追加するか削除するかの選択です。
state=presentとすればユーザーの追加、state=absentとすればユーザーの削除ができます。ちなみにstateはデフォルトでpresentとなっているため、ユーザーを追加する場合は指定は不要です。こうやってモジュールごとにオプションをしていき、処理を記述することでサーバーに対しての変更を加えていきます。
各モジュールのオプションして方法などは公式ドキュメントがあるので、そちらを確認するとよいでしょう。
Ansible モジュール一覧まとめ
今回はplaybookの書き方の触りまでを解説しました。
次回はplaybookを使ってwebサーバーに対して、PHP・Apache・MySQLのインストールなどを行っていきたいと思います。僕自身chefやpappetなどの構成管理ツールは今まで使ったことはないのですが、Ansibleの簡単・シンプルな構成によって特につまづくことなく導入できました。
これを機に、手順書を捨て、Ansibleに乗り換えてみてはいかがでしょうか?LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。