‘vagrant’ タグのアーカイブ

murave

Scalewayに30分でGitHubクローンを建てるよ

GitHubクローン、Gogs(https://gogs.io/)をScalewayに5分で建てるというLTネタができるのでは?
と思ってのにやってみたら30分かかることが判明したでござる(完全敗北)

こんにちプレミアム。公開は月曜日だけど書いているのはフライデー。muraveです。

ここのところ続けて書いている Vagrant + Ansible で Scaleway にサーバーを建てるネタの集大成的な内容です。シナリオは

  • CentOS7 インスタンスを起動
  • CentOS7 基本設定
    基本ツール類導入
  • firewalld起動

CEFSプロジェクト提供のエラッタに基づきセキュリティアップデートMySQL 5.7 導入Nginx 導入Gogs 導入Gogs 初期設定・インストール(Web画面)最初のユーザー(管理者)作成テスト用リポジトリ作成リポジトリにpush

Gogsの導入時にNginxのリバースプロキシ設定やSELinuxのポリシーモジュール追加などやってるのでPHP動かしたりするときなどにも色々と参考になると思います(と未来の自分に語りかける)

jmurabe/scaleway-centos7gogs

経過時刻を挿入しつつ vagrant up からの進行状況を貼っていきます。

2017年 9月29日 金曜日 13時20分27秒 JST
開始です。

$ vagrant up
Bringing machine 'default' up with 'scaleway' provider...
==> default: Creating a server with the following settings...
==> default: -- Commercial Type: VC1S
==> default: -- Image: 9103368e-4fab-4243-aa8d-18121796c086
==> default: -- Name: scw-******
==> default: Starting the server...
==> default: Waiting for server to become "ready"...
==> default: Waiting for SSH to become available...
2017年 9月29日 金曜日 13時22分53秒 JST
インスタンスが起動するのに2分半。

==> default: [vagrant-hostsupdater] Checking for host entries
==> default: Rsyncing folder: /Users/murave/scaleway/gogs/ => /vagrant
==> default: Running provisioner: ansible...
2017年 9月29日 金曜日 13時24分31秒 JST
プロビジョニング開始時で4分が経過。

default: Running ansible-playbook...

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [default]

TASK [centos7common : add EPEL] ************************************************
changed: [default]

TASK [centos7common : installs] ************************************************
changed: [default] => (item=[u'bind-utils', u'yum-utils', u'git', u'unzip', u'libselinux-python', u'libsemanage-python', u'policycoreutils-python', u'python-pip', u'firewalld'])

TASK [centos7common : running and enabled firewalld] ***************************
changed: [default]

TASK [centos7common : firewalld] ***********************************************
ok: [default]

TASK [centos7secup : install on yum security update] ***************************
changed: [default] => (item=[u'yum-plugin-security', u'createrepo', u'bzip2'])

TASK [centos7secup : check /security exists] ***********************************
ok: [default]

TASK [centos7secup : make /security] *******************************************
changed: [default]

TASK [centos7secup : create repo for CEFS project] *****************************
changed: [default]

TASK [centos7secup : download vmfarms/generate_updateinfo] *********************
changed: [default]

TASK [centos7secup : download CEFS errata.latest.xml.bz2] **********************
changed: [default]

TASK [centos7secup : update CEFS project repo and yum security update] *********
changed: [default]
2017年 9月29日 金曜日 13時31分54秒 JST
セキュリティアップデートおわったー。11分半経過。

TASK [mysql : install mysql57 repository] **************************************
changed: [default]

TASK [mysql : install on mysql] ************************************************
changed: [default] => (item=[u'mysql-community-server', u'MySQL-python'])

TASK [mysql : run and enable mysqld] *******************************************
changed: [default]

TASK [mysql : check /root/.my.cnf exists] **************************************
ok: [default]

TASK [mysql : get root temporary password] *************************************
changed: [default]

TASK [mysql : change root password] ********************************************
changed: [default]

TASK [mysql : deploy /root/.my.cnf] ********************************************
changed: [default]

TASK [mysql : deploy /etc/.my.cnf] *********************************************
changed: [default]

TASK [mysql : remove anonymous mysql_user] *************************************
ok: [default]

TASK [mysql : restart mysqld] **************************************************
changed: [default]
2017年 9月29日 金曜日 13時37分33秒 JST
MySQL導入(基本状態)、17分経過。

TASK [nginx : install nginx] ***************************************************
changed: [default]

TASK [nginx : running and enabled nginx] ***************************************
changed: [default]

TASK [nginx : firewalld] *******************************************************
changed: [default]

TASK [nginx : firewalld] *******************************************************
changed: [default]

2017年 9月29日 金曜日 13時39分00秒 JST
Nginx導入(基本状態)、18分半経過。

TASK [gogs : add git user] *****************************************************
changed: [default]

TASK [gogs : create mysql database for gogs] ***********************************
changed: [default]

TASK [gogs : create mysql user for gogs] ***************************************
changed: [default]

TASK [gogs : download gogs zip] ************************************************
changed: [default]

TASK [gogs : debug] ************************************************************
ok: [default] => {
"msg": "/home/git/linux_amd64_0.11.29.zip was downloaded"
}

TASK [gogs : unarchive gogs zip] ***********************************************
changed: [default]

TASK [gogs : cp gogs.service to /etc/systemd/system/] **************************
changed: [default]

TASK [gogs : running and enabled gogs] *****************************************
changed: [default]

TASK [gogs : copy nginx.conf(location deleted)] ********************************
changed: [default]

TASK [gogs : check gogs.conf] **************************************************
ok: [default]

TASK [gogs : set selinux's httpd_can_network_connect on] ***********************
ok: [default]

TASK [gogs : copy ssh_keygen_test.pp (custom policy module)] *******************
changed: [default]

TASK [gogs : install ssh_keygen_test.pp] ***************************************
changed: [default]

TASK [gogs : copy gogs.conf and restart nginx] *********************************
changed: [default]

RUNNING HANDLER [gogs : restart nginx] *****************************************
changed: [default]

PLAY RECAP *********************************************************************
default : ok=41 changed=33 unreachable=0 failed=0
2017年 9月29日 金曜日 13時44分08秒 JST
Gogsの導入まで完了しました。23分半。

IP確認のために vagrant ssh-config

$ vagrant ssh-config
Host default
HostName ***.***.***.***
User root
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/murave/.ssh/id_rsa
IdentitiesOnly yes
LogLevel FATAL
ブラウザでアクセスすると初期設定・インストール画面が表示されます。

  • MySQLのユーザをgogsに変更し、パスワードには.envのGOGS_MYSQL_PWに設定した文字列を入力
  • ドメイン、アプリケーションのURLをIPベースで入力(とりあえず)。
    NginxでリバースプロキシしているのでURLの3000番ポート指定ははずしてください。

「Gogsをインストール」をクリック

起動しました。

右上の「登録」から最初のユーザーを作成します。このユーザーは管理者になります。

ログインしてテスト用リポジトリを作成します。

画面の通りにコマンドラインで新しいリポジトリを作成してpushします。

2017年 9月29日 金曜日 13時49分32秒 JST
ということで、約29分でのゴールでした。

murave

ScalewayのSecurity groupに期待しすぎるのをやめる

muraveです。

自分の前の記事『Vagrant+AnsibleでCentOS7のセキュリティアップデートまで』の余談で「ScalewayのSecurity groupについて事前に調整しとくと良いよ」みたいなことを書きましたが、

「Scalewayさんのスパムメール送信対策なんやな〜」

ぐらいの気持ちで接してSecurity groupはなるべく素通しで他の手段で対策したほほうが良さそう、という話。

まず、このときにも書いたようにインスタンスを立ち上げ直さないと変更が反映されないので、この時点で実運用ではかなり致命的。

そして私が諦めた直接の理由ですが、inboundをまとめてdropして必要なportだけをacceptする設定にすると外部へのhttp/httpsアクセスができなくなる。つまり外部のAPIへのアクセスが遮断されます。

aws-cli使ってS3へのバックアップするときにコケてて原因調べたら外部へのhttp/httpsアクセスが全滅してたっていうね。

HTTP not working
https://community.online.net/t/http-not-working/1438

によると

With the rule TCP inbound 0.0.0.0/0 drop, outbounds connections can’t work. That’s because the firewall is stateless.

だそうです。

「iptablesつかえや」みたいな話がみえたので、CentOS7ですしfirewalldでがんばることにしました。

ということで、

jmurabe/scaleway-centos7base

更新しました。

ScalewayのCentOS7.3のイメージにはfirewalldの導入もされていなかったので導入して有効化する処理を追加しています。

sshを許可する処理も入れてますが、もともとsshは許可されているので書き方のサンプルみたいなものです。削除しても問題ありません。

ついでに、調査時digやnslookupが使えなくてつらかったのでbind-utils、みんなaws-cli入れるよね? いれるときに入ってたほうが便利よね? ってことでpython-pipなど追加してます。

murave

Vagrant+AnsibleでCentOS7のセキュリティアップデートまで

muraveです。ここ最近の記事、

についてスクリプト化してGitHubで公開しました

jmurabe/scaleway-centos7base

クラウド(Scaleway)上で動かすのでセキュリティ確保のために yum update するべき。しかし全部アップデートすると時間がかかりすぎる。そこでセキュリティアップデート出来るようにセットアップして実行するところまで自動で、という内容です。

冪等性が確保できているとは言い難い所はありますが(/securityが存在するか?だけでsecurityリポジトリが作成されているか判断している等)、ベースとしては使えるとおもいます。


実行するとこんな感じ(一部伏せてます)。

$ git clone git@github.com:jmurabe/scaleway-centos7base.git
Cloning into 'scaleway-centos7base'...
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 15 (delta 0), reused 15 (delta 0), pack-reused 0
Receiving objects: 100% (15/15), done.

$ cd scaleway-centos7base

$ cp .env.example .env
.env の内容を修正してください。

$ vagrant up
Bringing machine 'default' up with 'scaleway' provider...
==> default: Creating a server with the following settings...
==> default: -- Commercial Type: VC1S
==> default: -- Image: 9103368e-4fab-4243-aa8d-18121796c086
==> default: -- Name: scw-******
==> default: Starting the server...
==> default: Waiting for server to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: [vagrant-hostsupdater] Checking for host entries
==> default: Rsyncing folder: /Users/murave/scaleway/centos7base/ => /vagrant
==> default: Running provisioner: ansible...
default: Running ansible-playbook...

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [default]

TASK [centos7common : installs] ************************************************
changed: [default] => (item=[u'yum-utils', u'git', u'unzip', u'libselinux-python', u'libsemanage-python', u'policycoreutils-python'])

TASK [centos7secup : install on yum security update] ***************************
changed: [default] => (item=[u'yum-plugin-security', u'createrepo', u'bzip2'])

TASK [centos7secup : check /security exists] ***********************************
ok: [default]

TASK [centos7secup : make /security] *******************************************
changed: [default]

TASK [centos7secup : create repo for CEFS project] *****************************
changed: [default]

TASK [centos7secup : download vmfarms/generate_updateinfo] *********************
changed: [default]

TASK [centos7secup : download CEFS errata.latest.xml.bz2] **********************
changed: [default]

TASK [centos7secup : update CEFS project repo and yum security update] *********
changed: [default]

PLAY RECAP *********************************************************************
default : ok=9 changed=7 unreachable=0 failed=0

HostName(IP)はssh-configで確認するのが便利かと思います。

$ vagrant ssh-config
Host default
HostName ***.***.***.***
User root
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/murave/.ssh/id_rsa
IdentitiesOnly yes
LogLevel FATAL
余談centos7commonとSELinuxについてcentos7commonでSELinux制御絡みのパッケージ等を入れてるのは環境構築時に必要になるだろうという理由でなんですが、実は指定しているScalewayのイメージから起動するインスタンスではSELinuxは無効となっていたりします。

$ vagrant ssh
Last login: Tue Sep 19 08:41:21 2017 from 114.160.75.94
[root@scw-****** ~]# getenforce
Disabled
SELinux関係はVirtualBoxで試していて追加したのですが、そもそもcentos7common自体の内容が薄いのでこれをなくして、パッケージが必要なRoleすべてにinstallを書いたほうがRoleの再利用性が高まる気もしています。でも、Roleの依存性を全てなくそうとするのは逆効果ですしねぇ。

ScalewayのSecurity groupについて

このスクリプトで起動したScalewayのインスタンスでは、Default security group が設定されるかとおもいますので(ORGANIZATION DEFAULTを変更していなければ)、このフィルターを事前に調整しておくと良いかと思います。

ScalewayのSecurity groupの変更はインスタンス起動時しか反映されないようなので注意してください(稼働中インスタンスに適用するにはコントロールパネルからインスタンスを起動しなおさないとダメっぽい)

動作の詳細を確認したい時

Vagrantfileの

config.vm.provision "ansible" do |ansible|
ansible.playbook = "provisioning/playbook.yml"
#ansible.verbose = "extra"
ansible.limit = 'all'
end
でコメントアウトしている ansible.verbose = “extra” を生かして下さい。

murave

VagrantでScaleway使うと開発に便利なのでは?という話

Dockerに傾倒していたので久しぶりにVagrantさわりました。muraveです。

少し前に弊社代表から「ScalewayってクラウドARM使えるし安いし、いいよ!(ネットワーク的に遠くてもいい場合には)」という情報が社内Slackに投げ込まれて気になっておりました。

Scaleaway (https://www.scaleway.com/)

私としてはX86系最安価でも 2Core + 2GB Memory + 50GB SSD + 1public IPv4 という構成で €2.99/month (€1=¥130として¥388.7) の価格性能比に魅力を感じます。

更に調べると詳細には

  • VC1Sサーバー(2Cores 2GB Memory): €1/month (€0.002/hour)
  • 50GB SSD Volume: €1/month (€0.002/hour)
  • 1 public IPv4: €0.99/month (€0.002/hour)

合計 €2.99/month (€0.006/hour)

という価格内訳で(https://www.scaleway.com/faq/billing/)、パッケージ単位での上限が€2.99/monthとのこと。

上限が無くても時間単位で31日間フル稼働で€4.464(¥580.32)ですので、開発でインスタンスの使い捨てを繰り返して上限が無効な場合でもとんでもないことにはならないと思われます。

課金についてあまり気にしなくてもいいというのは精神的に良いです。

そんなわけでVagrantでScalewayをお気軽に使いたいと思います。

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

#.envにて各種設定(vagrantのpluginとしてdotenvが必要)
Dotenv.load

Vagrant.configure("2") do |config|
if ENV['TARGET'] == 'scaleway'
config.vm.provider :scaleway do |scaleway, override| #要vagrant-scaleway plugin
scaleway.token = ENV['SCALEWAY_TOKEN']
scaleway.organization = ENV['SCALEWAY_ORG']
scaleway.commercial_type = 'VC1S'
scaleway.image = '9103368e-4fab-4243-aa8d-18121796c086' #CentOS 7.3

override.ssh.private_key_path = ENV['SCALEWAY_PKEY']
override.nfs.functional = false
end
else
# ENV['TARGET']はboxの指定
config.vm.provider :virtualbox do |vb|
vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
end
config.vm.box = ENV['TARGET']
config.vbguest.auto_update = false
config.vm.network :private_network, ip: '192.168.66.10'
end
end
弊社ではサーバーにCentOSを使うことが多いのでscaleway.imageにはCentOS7.3のものを指定しています。秘匿したい各種パラメータは.envで与えます。

.env

TARGET = 'scaleway'
#TARGET = 'centos/7'
# for Scaleway
SCALEWAY_TOKEN = 'your Scaleway token'
SCALEWAY_ORG = 'your Scaleway organization id'
SCALEWAY_PKEY = '~/.ssh/id_rsa'
おまけでTARGETにboxを指定するとVirtualBoxで動作するようにしています。

plugin導入

未導入の場合は導入してください。

$ vagrant plugin install vagrant-scaleway
$ vagrant plugin install dotenv
必要情報の収集scaleway.token
トークンScalewayコントロールパネル、ユーザーのCredentialsで作成scaleway.organization
organization idcurl https://account.cloud.online.net/organizations -H “X-Auth-Token: トークン” で確認可能scaleway.commercial_type
サーバータイプCreate a server の画面で確認可能。‘VC1S’: StarterのX86最安価(2Cores, 2GB memory)scaleway.image
OSイメージID。作成されたサーバーについては FROM IMAGE からのリンク先で確認可能。その他設定についてoverride.ssh.private_key_path
ssh接続のための秘密鍵を指定事前にScalewayコントロールパネル、ユーザーのCredentialsから公開鍵の登録が必要override.nfs.functional = false
/vagrantについてnfs連携しようとしてエラーとなるのを防ぎ、rsync連携とする。基本操作vagrant upイメージからサーバーインスタンスを起動。ipはreservedされない(起動中のみ設定される)

$ vagrant up
Bringing machine 'default' up with 'scaleway' provider...
==> default: Creating a server with the following settings...
==> default: -- Commercial Type: VC1S
==> default: -- Image: 9103368e-4fab-4243-aa8d-18121796c086
==> default: -- Name: hugahoge
==> default: Starting the server...
==> default: Waiting for server to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: [vagrant-hostsupdater] Checking for host entries
==> default: Rsyncing folder: /Users/murave/scaleway/vagrant_only/ => /vagrant
稼働状況

サーバー

vagrant ssh

起動したサーバーインスタンスにsshで接続する。

vagrant ssh-config

ssh接続用情報を表示(IPアドレスの確認等可能)。

$ vagrant ssh-config
Host default
HostName 192.0.2.1
User root
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/murave/.ssh/id_rsa
IdentitiesOnly yes
LogLevel FATAL
※ HostNameはサンプル用IPに書き換えてます。

vagrant halt

サーバーインスタンス停止。

$ vagrant halt
==> default: Stopping the server...
==> default: [vagrant-hostsupdater] Removing hosts
稼働状況

停止中でもVolumeについては課金が発生します。一ヶ月止っぱなしで放置した場合でも€1はかかるということですね。

vagrant destroy

サーバーインスタンス破棄。

$ vagrant destroy
default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Destroying the server...
==> default: [vagrant-hostsupdater] Removing hosts
稼働状況

halt後にdestroyすると、このようにVolumeは削除されませんので注意が必要です(コントロールパネル等から削除するまで課金発生)

(haltせず)動作中にdestroyし「default: Are you sure you want to destroy the ‘default’ VM? [y/N]」で yとした場合はVolumeも削除されるので、インスタンスを使い捨てする場合にはhaltしないでdestroyしたほうが良いです。

murave

vagrant rsync-auto で rsync__exclude を変更しても反映されない場合

murave@歯医者さんから定期チェックの電話がかかってきたのでチャッチャと書かねば、です。

Vagrantで開発環境を整えていたのですが Synced Folder での権限周りで引っかかってしまいました。
それで、今頃、Rsync Synced Folder に気づいたのですが、いいですねコレ。

rsyncで同期されるので、開発機のパワー不足でクラウド環境にサーバーを建てて開発してる方も使えるはず。オススメです。

こちらの詳細は検索していただくと『Vagrant 1.5 で追加された Rsync Synced Folder が良い – Shin x blog』やQiitaの記事など良い情報がみつかるかと思います。

さて、本題です。Rsync Synced Folder で開発を始めると vagrant rsync-auto コマンドで自動でのrsync同期を行うのですが、rsync__excludeで指定した同期対象外設定を変更してもなぜか反映されないという現象に遭遇しました。

これに関する情報が日本語では見つからなかったのでメモを残しておきます。

Previous Rsync Exclude setting caused duplicate rsync on rsync-auto #4567

ここに同様の現象に遭遇している方々がいらっしゃいます。そしてthePanzさんが以下の解決策を提示しておられます。

vagrant halt
rm .vagrant/machines/default/virtualbox/synched_folders
vagrant up

同様の現象にあったらお試し下さい(Vagrantのバージョンアップも忘れずに!)

haraguchi

一つのVagrantfileで複数VMを管理する際のメモ

下記のようなVagrantfileで複数VMを管理している際に「vagrant halt」を行うと…

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
config.vm.define :first do |first|
first.vm.box = "centos6.5.3"
first.vm.network :forwarded_port, guest: 80, host: 8080
first.vm.network :private_network, ip: "192.168.33.10"
end

config.vm.define :second do |second|
second.vm.box = "centos6.5.3"
second.vm.network :forwarded_port, guest: 80, host: 8181
second.vm.network :private_network, ip: "192.168.33.11"
end
end

2つとも停止します。

~/w/vagrantTest ❯❯❯ vagrant halt
second: Attempting graceful shutdown of VM...
first: Attempting graceful shutdown of VM...

片方だけ停止したい場合には「vagrant halt first」のように引数にマシン名を指定すれば良いのですが
停止したくないマシンまで誤って停止させるのを避けたかったので、何か良い方法はないか調べました。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

if ARGV[1] == "first" # 追加
config.vm.define :first do |first|
first.vm.box = "centos6.5.3"
first.vm.network :forwarded_port, guest: 80, host: 8080
first.vm.network :private_network, ip: "192.168.33.10"
end
end # 追加
if ARGV[1] == "second" # 追加
config.vm.define :second do |second|
second.vm.box = "centos6.5.3"
second.vm.network :forwarded_port, guest: 80, host: 8181
second.vm.network :private_network, ip: "192.168.33.11"
end
end # 追加
end

このようにすると「vagrant halt」だけでは停止しなくなり、マシン名を指定することで停止出来るようになります。