はじめに
Ubuntu特集週みたいになってますね!
vagrant + ansible
今回はvagrantで作ったVMに、ansibleでdeployを実施しましょう。
まずカンタンな例。hatenabot serverにpythonのbeautiful soupをいれます。
ansibleは牛さんの本を以前読んでいたんでした。
とはいえ、自動化する前にかならず手作業が存在しますね。デフォルトでpythonは入っているでしょうから、pipのinstallとpipでbeautiful soupのinstallを実施してみましょう。
ちなみに興味があったのでdeployの時間をはかってみます。
take@lenovo:~/work/vagrant/hatenabot$ time vagrant up Bringing machine 'hatenabot' up with 'virtualbox' provider... ==> hatenabot: Importing base box 'CentOS72'... ==> hatenabot: Matching MAC address for NAT networking... ==> hatenabot: Setting the name of the VM: hatenabot_hatenabot_1476188979659_21001 ==> hatenabot: Clearing any previously set network interfaces... ==> hatenabot: Preparing network interfaces based on configuration... hatenabot: Adapter 1: nat hatenabot: Adapter 2: hostonly ==> hatenabot: Forwarding ports... hatenabot: 22 (guest) => 2222 (host) (adapter 1) ==> hatenabot: Booting VM... ==> hatenabot: Waiting for machine to boot. This may take a few minutes... hatenabot: SSH address: 127.0.0.1:2222 hatenabot: SSH username: vagrant hatenabot: SSH auth method: private key hatenabot: hatenabot: Vagrant insecure key detected. Vagrant will automatically replace hatenabot: this with a newly generated keypair for better security. hatenabot: hatenabot: Inserting generated public key within guest... hatenabot: Removing insecure key from the guest if it's present... hatenabot: Key inserted! Disconnecting and reconnecting using new SSH key... ==> hatenabot: Machine booted and ready! ==> hatenabot: Checking for guest additions in VM... hatenabot: The guest additions on this VM do not match the installed version of hatenabot: VirtualBox! In most cases this is fine, but in rare cases it can hatenabot: prevent things such as shared folders from working properly. If you see hatenabot: shared folder errors, please make sure the guest additions within the hatenabot: virtual machine match the version of VirtualBox you have installed on hatenabot: your host and reload your VM. hatenabot: hatenabot: Guest Additions Version: 4.3.30 hatenabot: VirtualBox Version: 5.1 ==> hatenabot: Setting hostname... ==> hatenabot: Configuring and enabling network interfaces... ==> hatenabot: Mounting shared folders... hatenabot: /vagrant => /home/take/work/vagrant/hatenabot real 1m31.588s user 0m5.980s sys 0m2.516s
1分30秒!はやいですねー。これからいろいろdeployすれば増えていくでしょう。
手作業でインストール
[vagrant@hatenabot ~]$ python --version Python 2.7.5
wgetする。
[vagrant@hatenabot ~]$ wget https://bootstrap.pypa.io/get-pip.py --2016-10-11 13:34:58-- https://bootstrap.pypa.io/get-pip.py bootstrap.pypa.io (bootstrap.pypa.io) をDNSに問いあわせています... 151.101.88.175 bootstrap.pypa.io (bootstrap.pypa.io)|151.101.88.175|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 1524722 (1.5M) [text/x-python] `get-pip.py' に保存中 100%[===========================================================================>] 1,524,722 2.12MB/s 時間 0.7s 2016-10-11 13:34:59 (2.12 MB/s) - `get-pip.py' へ保存完了 [1524722/1524722]
入りました!
[vagrant@hatenabot ~]$ sudo python get-pip.py Collecting pip Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB) 100% |████████████████████████████████| 1.2MB 803kB/s Collecting setuptools Downloading setuptools-28.3.0-py2.py3-none-any.whl (467kB) 100% |████████████████████████████████| 471kB 1.2MB/s Collecting wheel Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB) 100% |████████████████████████████████| 71kB 2.5MB/s Installing collected packages: pip, setuptools, wheel Successfully installed pip-8.1.2 setuptools-28.3.0 wheel-0.29.0 [vagrant@hatenabot ~]$ pip --version pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
簡単に入りました。
[vagrant@hatenabot ~]$ sudo pip install beautifulsoup4 Collecting beautifulsoup4 Downloading beautifulsoup4-4.5.1-py2-none-any.whl (83kB) 100% |████████████████████████████████| 92kB 1.3MB/s Installing collected packages: beautifulsoup4 Successfully installed beautifulsoup4-4.5.1
playbookを書く
Vagrantファイルを変更します。ansibleでprovisioningするための、playbook、インベントリファイルのパス、関連付けのためのlimitを設定します。
Vagrant.configure(2) do |config| config.vm.box = "CentOS72" config.vm.hostname = "hatenabot" config.vm.network "private_network", ip: "192.168.100.100" config.vm.provision "shell", inline: <<-SHELL systemctl restart network.service SHELL config.vm.provision "ansible" do |ansible| ansible.playbook = "provisioning/site.yaml" ansible.inventory_path = "provisioning/hosts" ansible.limit = 'all' end end
なぜnetworkをrestartしているかというと、内部のCentOS7向けのnetwork設定が不十分で、最初から入ってるdhcpでのネットワーク設定が残ったままになっていて、provisionしたあとしばらくすると設定した固定ipが外れてしまう問題が発生したので、対処としていれました。
インベントリファイルを作成。
take@lenovo:~/work/vagrant/hatenabot$ cat provisioning/hosts [vagrants] 192.168.100.100 [all:vars] ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_pass=vagrant ansible_sudo_pass=vagrant
パスワード認証するならsshpassをいれてねと言われる。うーん。
take@lenovo:~/work/vagrant/hatenabot$ ansible-playbook -i provisioning/hosts provisioning/site.yaml [DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. PLAY *************************************************************************** TASK [setup] ******************************************************************* fatal: [192.168.100.100]: FAILED! => {"failed": true, "msg": "ERROR! to use the 'ssh' connection type with passwords, you must install the sshpass program"} NO MORE HOSTS LEFT ************************************************************* PLAY RECAP ********************************************************************* 192.168.100.100 : ok=0 changed=0 unreachable=0 failed=1
パスワード認証を使うシーンはあると思うが、vagrantで作ったので鍵の場所を教えてあげればいけそうかな。
このあとなぜかeasy_installでpipが入らないのにめちゃくちゃハマる。
最終的には以下のようになった。
take@lenovo:~/work/vagrant/hatenabot$ ls -lh ./* -rw-rw-r-- 1 take take 337 10月 11 22:22 ./Vagrantfile -rw-rw-r-- 1 take take 191 10月 11 22:44 ./ansible.cfg ./provisioning: 合計 8.0K -rw-rw-r-- 1 take take 28 10月 11 22:38 hosts -rw-rw-r-- 1 take take 159 10月 11 23:01 site.yaml
ansible.cfgに鍵の場所を書いてやる。
take@lenovo:~/work/vagrant/hatenabot$ cat ansible.cfg [defaults] hostfile = provisioning/hosts remote_user = vagrant private_key_file = /home/take/work/vagrant/hatenabot/.vagrant/machines/default/virtualbox/private_key host_key_checking = False
hostsはこんだけにして
take@lenovo:~/work/vagrant/hatenabot$ cat provisioning/hosts [vagrants] 192.168.100.100
playbook、yumでpipいれました。
take@lenovo:~/work/vagrant/hatenabot$ cat provisioning/site.yaml --- - hosts: all become: yes tasks: - name: install yum package yum: name={{item}} with_items: - epel-release - python-pip - name: install pip package pip: name=beautifulsoup4
はい、壊してもう一度作る。
take@lenovo:~/work/vagrant/hatenabot$ vagrant destroy -f ==> default: Forcing shutdown of VM... ==> default: Destroying VM and associated drives... take@lenovo:~/work/vagrant/hatenabot$ time vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'CentOS72'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: hatenabot_default_1476195115585_78133 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: hostonly ==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key... ==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... default: The guest additions on this VM do not match the installed version of default: VirtualBox! In most cases this is fine, but in rare cases it can default: prevent things such as shared folders from working properly. If you see default: shared folder errors, please make sure the guest additions within the default: virtual machine match the version of VirtualBox you have installed on default: your host and reload your VM. default: default: Guest Additions Version: 4.3.30 default: VirtualBox Version: 5.1 ==> default: Setting hostname... ==> default: Configuring and enabling network interfaces... ==> default: Mounting shared folders... default: /vagrant => /home/take/work/vagrant/hatenabot ==> default: Running provisioner: shell... default: Running: inline script ==> default: Running provisioner: ansible... default: Running ansible-playbook... PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [192.168.100.100] TASK [install yum package] ***************************************************** changed: [192.168.100.100] => (item=[u'epel-release', u'python-pip']) TASK [install pip package] ***************************************************** changed: [192.168.100.100] PLAY RECAP ********************************************************************* 192.168.100.100 : ok=3 changed=2 unreachable=0 failed=0 real 2m5.515s user 0m11.680s sys 0m4.876s take@lenovo:~/work/vagrant/hatenabot$
30秒ほど伸びましたが、ちゃんと配備できました!
github
今日のコードはgithubにpushしています。
日々進化していくのでこの記事に載っているコードと変わる可能性はありますが。。。
おわりに
前回vagrant + ansibleやったときから時間が経っていて忘れていたので苦戦しました。実業務でも、仕事は全部(作業メモも)gitにあげる週間づいて、プライベートの勉強でも書いたコードは全部githubにあげて、業務中も参考にするぐらいの勢いでいこうと思います。
今度やっていきたいことは、
- beautifulsoupとhatenapiを使ったスクレイピング
- rubyとcapistranoとserverspec環境のprovisioning
- phpipamのprovisioning
です!自分のクラウド環境育てるの楽しいね!