ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

UbuntuのVirtualBox上にVagrant+Ansibleでpipとbeautiful soupをinstallする

はじめに

Ubuntu特集週みたいになってますね!

take-she12.hatenablog.com

take-she12.hatenablog.com

take-she12.hatenablog.com

take-she12.hatenablog.com

vagrant + ansible

今回はvagrantで作ったVMに、ansibleでdeployを実施しましょう。

まずカンタンな例。hatenabot serverにpythonのbeautiful soupをいれます。

ansibleは牛さんの本を以前読んでいたんでした。

take-she12.hatenablog.com

とはいえ、自動化する前にかならず手作業が存在しますね。デフォルトで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すれば増えていくでしょう。

手作業でインストール

CentOS 7.2はpythonがデフォルトですね。

[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しています。

github.com

日々進化していくのでこの記事に載っているコードと変わる可能性はありますが。。。

おわりに

前回vagrant + ansibleやったときから時間が経っていて忘れていたので苦戦しました。実業務でも、仕事は全部(作業メモも)gitにあげる週間づいて、プライベートの勉強でも書いたコードは全部githubにあげて、業務中も参考にするぐらいの勢いでいこうと思います。

今度やっていきたいことは、

です!自分のクラウド環境育てるの楽しいね!