実践記録8
実践記録7でAnsibleを使ってnginxにBasic認証を導入してみました。
しかしAnsibleの実行など一部手作業が含まれている状態でしたので、
vagrant upを実行すれば処理が一括で進むようVagrantfileを修正していきたいと思います。
今回だいぶエラーにはまりました。。
前提
VirtualBoxとVagrantがインストールされていること。
インストール方法は以下の記事を参考
実践記録1VirtualBoxをインストールしてローカル開発環境を構築してみたいと思います。AWSなどのクラウドサービスを使った方が最近は簡単に環境を準備できますが、まずは自分のPCに仮想環境を構築してみようと思います。[…]
実践記録2実践記録1でVirtualBoxを使ってローカル開発環境を構築してみましたが、今回はVagrantという仮想環境構築ツールを使ってVirtualBox上に仮想マシンを構築してみようと思います。前提使用する環境にVi[…]
VagrantでAnsibleを実行する
現在のVagrantfileとAnsibleのplaybookの定義状況は以下の通りです。
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 |
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 |
実践記録7前回までVagrantを用いて環境構築をしていましたが、今回はAnsibleを使用してみたいと思います。Ansibleを使うことでVagrantだけで構成するよりもより汎用的な構成管理を行うことを目指します。前提V[…]
今回は最終的な状態から公開します。
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 45 46 47 48 49 50 51 | 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 # DNS設定 config.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 SHELL # yumタイムアウト設定 config.vm.provision "shell", inline: <<-'SHELL' echo -e 'timeout=60' >> /etc/yum.conf SHELL # 共通パッケージインストール config.vm.provision "shell", inline: <<-'SHELL' yum -y install epel-release SHELL # 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" end # 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", mount_options: ['dmode=775', 'fmode=775'] server.vm.provision "ansible_local" do |ansible| ansible.playbook = "playbook.yml" ansible.provisioning_path = "/vagrant_data/ansible" ansible.inventory_path = "/vagrant_data/ansible/inventory/hosts" ansible.limit = 'all' end end end |
目玉でもあるAnsibleの設定は以下の部分です。
1 2 3 4 5 6 | server.vm.provision "ansible_local" do |ansible| ansible.playbook = "playbook.yml" ansible.provisioning_path = "/vagrant_data/ansible" ansible.inventory_path = "/vagrant_data/ansible/inventory/hosts" ansible.limit = 'all' end |
VagrantfileからAnsibleを実行する為に「ansible_local」というプロビジョニングを使用しました。
よく似た名称の「ansible」というプロビジョニングを使用すると、ホストOS側にAnsibleを導入する必要が出てきてしまうので、
仮想マシン上のAnsibleを使用するための「ansible_local」の方を使用しています。
ansible_localを使用すると対象サーバにAnsibleが導入されているか自動でチェックして、
インストールされていなければインストールしてくれます。
たったこれだけの定義なのですが、色々な落とし穴にはまったので紹介していきます。
エラー大全
Failed to connect to the host via ssh: Host key verification failed
Ansibleを実行する為には対象サーバへSSHで接続できる必要があります。
SSH接続用の公開鍵認証の設定などは導入済みですが、Vagrantfileから実行する為には1つ問題がありました。
それがこれです。
見たことある方も多いのではないでしょうか。
初回SSH接続時に表示される、「この接続先繋ぐの初めてだけど大丈夫?」確認です。
こいつがある為、VagrantでAnsibleを実行する時にSSH接続ができず、以下のエラーが発生しました。
こいつの解消方法としては
AnsibleがSSH接続を行う時に、確認が行われないようにansible.cfgに以下の設定を組み込む必要があります。
1 2 | [ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null |
このファイルを後述のprovisioning_pathに配置することでSSH接続ができるようになります。
[WARNING] Ansible is being run in a world writable directory
provisopning_pathはVagrantがansible_localを実行する際に基準とするパスを指定する項目です。
ここにplaybookやansible.cfgを配置します。
ファイルの配置方法ですが、プロビジョンの中で作成するよりも、
予めホストマシンに配置しておいて、フォルダ同期させた方が楽です。
しかし、、、
単純にフォルダ同期させた場所にplaybookやansible.cfgを配置して実行すると以下の様なエラーがでます。
どうやらAnsibleがansible.cfgを書き込み可能な作業ディレクトリからロードすると
エラーとなって、読み込みを行わないようです。。
すると当然先ほどのSSH接続エラー回避の定義が読み込まれないのでまたエラーになりました。。。
そこで、フォルダ同期させたフォルダの権限を変更します。
ここで気を付けて頂きたいのが、Vagrantでフォルダ同期を行っている場合、
そのフォルダのディレクトリやファイルの権限をchmodコマンドで変更はできないということです。
変更する為にはVagrantfileを以下の様に修正する必要がありました。
1 | server.vm.synced_folder "./host", "/vagrant_data",type:"virtualbox", mount_options: ['dmode=775', 'fmode=775'] |
後半の「mount_options」以降が権限設定となります。
デフォルトでは「777」になりますが、ひとまずエラー回避の為に「775」に変更してみたところエラーを回避することができました。
Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds
Ansibleとは直接関係ないのですが、Vagrantfileで仮想マシンを構築しているときに
時々以下の様なエラーが発生していました。
これはyumコマンド実行時にデフォルトのタイムアウト時間である30秒を超えて、タイムアウトになった為に発生するエラーのようです。
yum.confに以下の定義を入れるようVagrantfileを修正しましたので、
こちらも合わせて記載しておきます。
1 | timeout=60 |
色々とエラーにひっかかりましたが、
これでvagrant upコマンド一発でAnsibleのホストサーバと、
Basic認証機能付きnginxを搭載したwebサーバが構築できるようになりました!!
個人的には中々の達成感です。
今回はここまでにします。
続きは以下の記事になります!
実践記録9前回までVagrnatとAnsibleを使ってIaCっぽい事をしてきましたが、今回は少し路線を変えてDockerを使ってみたいと思います。世の中的には今更って思われるのかもしれませんが、AWS等のクラウドでコン[…]
コメントを書く