実践記録7
前回までVagrantを用いて環境構築をしていましたが、今回はAnsibleを使用してみたいと思います。
Ansibleを使うことでVagrantだけで構成するよりもより汎用的な構成管理を行うことを目指します。
前提
VirtualBoxとVagrantがインストールされていること。
インストール方法は以下の記事を参考
実践記録1VirtualBoxをインストールしてローカル開発環境を構築してみたいと思います。AWSなどのクラウドサービスを使った方が最近は簡単に環境を準備できますが、まずは自分のPCに仮想環境を構築してみようと思います。[…]
実践記録2実践記録1でVirtualBoxを使ってローカル開発環境を構築してみましたが、今回はVagrantという仮想環境構築ツールを使ってVirtualBox上に仮想マシンを構築してみようと思います。前提使用する環境にVi[…]
Ansibleのインストール
実践記録6で使用したVagrantfileを使用してAnsibleをインストールします。
実践記録6実践記録5でAnsibleが使えるように複数サーバ間のSSH接続用の公開鍵認証設定を行いました。しかし手動での設定は無くしたいので、Vagrantfileを修正して公開鍵認証の設定を自動でできるようにしたいと思いま[…]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | Vagrant.configure("2") do |config| # boxの指定 config.vm.box = "centos/7" # 仮想マシン間公開鍵認証設定 config.ssh.insert_key = false config.vm.provision "file", source: "~/.vagrant.d/insecure_private_key", destination: "/home/vagrant/.ssh/id_rsa" config.vm.provision "shell", privileged: false, inline: <<-SHELL chmod 600 $HOME/.ssh/id_rsa SHELL # hostサーバの作成 config.vm.define :demohost do |server| server.vm.hostname = "demohost" server.vm.network "private_network", ip: "192.168.33.10" server.vm.synced_folder "./host", "/vagrant_data",type:"virtualbox" server.vm.provision "shell", inline: <<-'SHELL' sed -i -e '/^\[main\]$/a dns=none' /etc/NetworkManager/NetworkManager.conf systemctl restart NetworkManager wait echo -e 'nameserver 8.8.8.8\nnameserver 8.8.4.4' >> /etc/resolv.conf yum -y install epel-release yum -y install ansible SHELL end # webサーバの作成 config.vm.define :demoweb do |server| server.vm.hostname = "demoweb" server.vm.network "private_network", ip: "192.168.33.11" server.vm.synced_folder "./web", "/vagrant_data",type:"virtualbox" server.vm.provision "shell", inline: <<-'SHELL' sed -i -e '/^\[main\]$/a dns=none' /etc/NetworkManager/NetworkManager.conf systemctl restart NetworkManager wait echo -e 'nameserver 8.8.8.8\nnameserver 8.8.4.4' >> /etc/resolv.conf yum -y install epel-release yum -y install nginx echo "hello world!!" > /usr/share/nginx/html/index.html systemctl start nginx SHELL end end |
demoweb:Ansibleで構築されるサーバ
AnsibleでnginxにBasic認証を導入
早速使っていきたいと思います。
まずはAnsibleが各サーバを認識できるようにインベントリファイル(hostsファイル)を作成します。
/etc/ansible/hostsファイルを以下の様に修正します。
1 2 3 4 | [host] 192.168.33.10 [web] 192.168.33.11 |
hostsファイルを編集したらとりあえず一回動かしてみたいと思います。
ansibleは以下のコマンドで指示を送ることができるようです。
モジュールとはAnsibleに指示を送る為の専用コマンドの様なものです。
無事に動きました。
Ansibleではこの様に直接コマンドを入力して処理を実行することもできますが、
playbookというものを使ってまとめて処理を行うことができます。
playbookを使ってwebサーバにnginxを導入しつつ、Basic認証をかけてみたいと思います。(認証はやってみたいからやるだけです)
既にVagrantfileでnginxは導入してしまっているので、Ansibleの冪等性の確認もしてみたいと思います。
冪等性とは「何度実行しても同じ結果が得られる性質」のことだそうです。
今回でいえば、nginxが導入されてなければ導入するし、
導入されていれば何もしない。
何度実行しても結果として導入されている状態になるという事です。
ではここからは作業に入っていきます。
Basic認証をかけない状態でアクセスすると以下の様になります。
とりあえず見よう見まねでplaybookを作成しました。(後ほど内容載せます。)
実行する前に以下のコマンドでplaybookの構文エラーがないか確認してくれるようです。
・コロンの後ろも一つ空白を入れる
・タブは使用不可
・インデントは半角2つで正確に
※最初に載せなかったのはあまりに修正点多かったからです(笑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | - hosts: web become: true vars: path: /etc/nginx/.htpasswd user: demo passwd: demopassword tasks: - name: install nginx yum: name=nginx state=latest - name: start nginx and enabled service: name=nginx state=started enabled=yes - name: install passlib yum: name=passlib state=latest - name: install htpasswd yum: name=httpd-tools state=latest - name: basic-auth setup htpasswd: path: '{{path}}' name: '{{user}}' password: '{{passwd}}' owner: root group: nginx mode: 0640 - name: nginx.conf change template: src: /vagrant_data/nginx.conf dest: /etc/nginx/nginx.conf owner: root group: nginx mode: 0640 notify: - restart nginx handlers: - name: restart nginx service: name=nginx state=restarted |
hosts:処理対象
become:sudoで実行するか
vars:変数
tasks:処理内容
handlers:tasks内のnotifyに連動して呼び出される処理
です。
Basic認証を実装するためにhtpasswdをインストールする必要がありますが、
htpasswdを使用する為にはpasslibが必要となるのでそちらも合わせてインストールするようにしています。
またBasic認証用の設定を定義したnginx.confファイルを配置する為に、templateモジュール(ファイルの置き換え用モジュール)を使用しています。
そのため、Vagrantfileでdemohostサーバのフォルダと同期させているホストOSのフォルダにnginx.confファイルを配置しています。
※「server.vm.synced_folder」で定義しているフォルダのことです。
nginx.confファイルはデフォルトの状態から以下のlocation設定内に2行追加したのみです。
※本当は設定を入れ込む様にしたかったのですが上手くできなかったので一旦これで。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { auth_basic "Please enter ID and password"; auth_basic_user_file /etc/nginx/.htpasswd; } } |
これで完璧のはず!
以下のコマンドで実行します。
調べてみるとyumの代わりにpipというコマンドを使うそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | - hosts: web become: true vars: path: /etc/nginx/.htpasswd user: demo passwd: demopassword tasks: - name: install nginx yum: name=nginx state=latest - name: start nginx and enabled service: name=nginx state=started enabled=yes - name: install python-pip yum: name=python-pip state=latest - name: install passlib pip: name: passlib - name: install htpasswd yum: name=httpd-tools state=latest - name: basic-auth setup htpasswd: path: '{{path}}' name: '{{user}}' password: '{{passwd}}' owner: root group: nginx mode: 0640 - name: nginx.conf change template: src: /vagrant_data/nginx.conf dest: /etc/nginx/nginx.conf owner: root group: nginx mode: 0640 notify: - restart nginx handlers: - name: restart nginx service: name=nginx state=restarted |
じゃん!
完璧ですね。
Ansibleには冪等性があるので既にVagrantfileで導入済みのnginxのインストールタスクはステータスが「OK」となっています。
すなわちインストール済みですよってことですね。
それ以降のタスクについてはインストールをしたり、ファイルを置き換えたりして状態が変わっているので「changed」のステータスになっています。
Basic認証が導入できているかテストしてみます。
こちらもばっちりですね。
普通にアクセスしようとすると401エラー(認証エラー)になっており、
認証情報を渡すとアクセスに成功しています!!
ちなみにもう一度playbookを実行すると以下の様になります。
全て導入済みの設定なのでステータスは「OK」となり、変化なしです。
その場合handlerは実行されないようです。
vagrant up実行時点でこの状態までもっていきたいですね。
長くなってきたので今回はここまでにします。
続きは以下の記事となります!
実践記録8実践記録7でAnsibleを使ってnginxにBasic認証を導入してみました。しかしAnsibleの実行など一部手作業が含まれている状態でしたので、vagrant upを実行すれば処理が一括で進むようVagran[…]
コメントを書く