Vagrantfileで自動で仮想環境を構築する

Python学習【365日チャレンジ!】242日目のマスターU(@Udemy11)です。

いまさらながらですが、「学年ビリのギャルが1年で偏差値を40上げて慶応大学に現役合格した話」通称「ビリギャル」を読みました。

映画を見たことはあったので、特段読む必要性に駆られていたわけではないのですが、坪田先生の「才能の正体」をオーディブルで聴いていると、やっぱり処女作は読んどかないとな~ということで読むことにしました。

レビューはAmazonやWebに任せるとして、映画では理解できないバックグラウンドがわかるのがおもしろくて、あっという間に読み終えてしまいました。

次は、「才能の正体」でふれられていたジョン・フォン・ノーマンの「ゲーム理論」に関する本を読んでみようかと思っています。

昨日までの復習

この二日間でVirtualboxとVagrantをインストールしました。

復習ということもないので、詳細については、昨日までの記事をごらんください。

今日は、VagrantfileでVMを立ち上げる方法を学習します。

仮想環境を構築

設定などを書き込んだファイルがVagrantfileで、今回、酒井さんの講座で用意されているものを使わせていただきました。

Udemy講師 酒井さん プログラミング Python

Pycharmのプロジェクトフォルダに用意されているVagrantfileとフォルダopsをドラッグ&ドロップしてからターミナルでコマンドvagrant upを実行します。

opsフォルダの中には、空のansible_projectfab_projectフォルダが用意されています。

Vagrantfileで自動で仮想環境を構築する

ドラッグ&ドロップすると下記のようなポップアップが表示されるので、【refactor】をクリックします。

Vagrantfileで自動で仮想環境を構築する

このあと、ターミナルからlsコマンドでファイルを表示してみると、当然のことながらvagrantfileがあるので、vagrant upコマンドを実行して、環境を構築します。

Vagrantfileで自動で仮想環境を構築する

構築する仮想環境は、3日前にイメージとして紹介したものです。

仮想環境構築の自動化

環境の構築には、時間がかかります。
私のMacBookProでは、約15分ほどかかりました。

完了すれば、Pycharmのプロジェクトに次のようなディレクトリが作成されます。

Vagrantfileで自動で仮想環境を構築する

mainがメインサーバーでserver1server2が作成されているのがわかります。

Vagrantfile

用意されたものを実行しただけなので、全くもって意味がわかりませんが、Vagrantfileの中身をみてみましょう。

$ssh_enable = <<SCRIPT
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get install -y expect
sudo sed -i 's/prohibit-password/yes/' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo service sshd restart
echo '#!/usr/bin/expect
set timeout 20
spawn sudo passwd root
expect "Enter new UNIX password:" {send "root\\r"}
expect "Retype new UNIX password:" {send "root\\r"}
interact' > change_password
chmod +x change_password
./change_password
SCRIPT

$install_package = <<SCRIPT
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install python3-pip
sudo apt-get -y install sshpass
sudo apt-get -y install python-dev python3-dev 
sudo apt-get -y install libssl-dev libffi-dev libxml2-dev libxslt1-dev zlib1g-dev
sudo pip3 install --upgrade setuptools
sudo pip3 install Fabric==1.14.0
sudo pip3 install Fabric3
sudo pip3 install ansible==2.4.2.0
SCRIPT

Vagrant.configure(2) do |config|
  config.vm.define 'main' do |main|
    main.vm.hostname = 'main'
    main.vm.box = 'ubuntu/xenial64'
    main.vm.network 'private_network', ip: '10.0.0.100'
    main.vm.synced_folder 'ops/', '/srv/ops'
    main.vm.provision 'shell', inline: $install_package
  end

  config.vm.define 'server1' do |server1|
    server1.vm.hostname = 'server1'
    server1.vm.box = 'ubuntu/xenial64'
    server1.vm.network :forwarded_port, guest: 5000, host: 8001, id: 'http'
    server1.vm.network 'private_network', ip: '172.16.200.101'
    server1.vm.provision 'shell', inline: $ssh_enable
  end

  config.vm.define 'server2' do |server2|
    server2.vm.hostname = 'server2'
    server2.vm.box = 'ubuntu/xenial64'
    server2.vm.network :forwarded_port, guest: 5000, host: 8002, id: 'http'
    server2.vm.network 'private_network', ip: '172.16.200.102'
    server2.vm.provision 'shell', inline: $ssh_enable
  end
end

1行目から16行目と18行目から29行目は下の方に記述しているVagrantの設定ファイルで指定しているスクリプトです。

31行目からが設定のコードで、31行目のdoと55行目のendで挟んでconfigを記述していますが、入れ子にしたdoendでそれぞれのサーバーを設定しています。

ubuntuは無料で使えるオペレーティングシステムで、メインのサーバー(main)には、名前、ubuntuのデータフォルダ、IPアドレス、Macと同期するための設定、sshを使うための設定を記述しています。

それぞれのサーバー(server1,server2)には、メインサーバーと同じように、ホストの名前、ubuntu、IPアドレス、sshの設定に加えて、ポートの設定を記述しています。

ここで指定している$install_package$ssh_enableが1行目から29行目で記述しているスクリプトです。

mainの方には、python3-pipsshpasspython-devpython3-devlibssl-devlibffi-devlibxml2-devlibxslt1-devzlib1g-devsetuptoolsFabric1.14.0Fabric3ansible2.4.2.0をインストールしています。

サーバー1.2については、最初にアップデートするのは同じで、expectを使って、rootのパスワードを書き換えるようにしています。

5行目、6行目でsshが使えるように設定し、7行目からのechoでパスワードを変更するexpectのスクリプトを記述しています。

ユーザーネームとパスワードをrootにしていますが、あくまでテストなので、実際はきちんとしたユーザーネームとパスワードを設定する必要があります。

ちんぷんかんぷん

久しぶりにちんぷんかんぷんな内容でした。

用意してもらったVagrantfileをそのまま実行しただけなので、まったくもって何を実行しているのかが理解できませんでした。

なので、実行しているVagrantfileをきちんと学習してどのような動きに必要なのか、考える必要があります。

今回は、テスト環境を構築するために使っているので、ちょっとづつ使いながらなれていくしかないのかなと感じています。

久しぶりに頭の中に?マークがたくさん浮かんでいたレクチャーでした。

それでは、明日もGood Python!