先日、Docker for Windowsを導入した関係でVirtualBoxからHyper-Vに切り替えました。
Docker For Windowsをインストールする
DockerでできることはDockerでやるんですけど、どうしても素のLinux環境がほしいことがあってVagrantからHyper-Vの仮想環境を作ってみました。
これが、VirtualBoxとかなり違い最終的に起動はできたのですが、残念ながら目標は達成できず・・・。
目標
VagrantでVirtualBoxの仮想環境を作るときと同じことをしたいので、最低限以下を目標にしました。
・VagrantfileからIPアドレスを設定できる(達成できず)
・ホストの任意のディレクトリ(フォルダー)をゲストの任意のディレクトリにマウントできる
・AnsibleLocalプロビジョナーでプロビジョンを実行できる
boxはcentos/7
を使いました。
vagrant
を実行するコマンドプロンプトやPower Shellは管理者として実行しておく必要があります。
環境
・Windows10 Pro
・Vagrant 1.9.5
VagrantfileでIPの設定
Hyper-Vで仮想スイッチの作成
外部ネットワークに接続するためにHyper-Vのコンソールから外部スイッチを作成しておく必要があります。
StaticIPが設定されない
最初から躓いたのですが、Vagrantfileにconfig.vm.network
でIPの設定を書くと思うのですが、これが反映されません。
以下に記載があるのですが、StaticIPは対応していないみたい。
Limitations
Hyper-Vで外部ネットワークの仮想スイッチを作成して、vagrant up
の起動時に作成したスイッチを選択するとDHCPでIPが割り当てられました。
DHCPでIPが割り当てられるかは環境によると思います。起動時にIP情報が表示されます。
shared_foldersの設定
SMBでマウントしました。
[ruby]
config.vm.synced_folder "." , "/vagrant" , type: "smb", smb_username: “username”, smb_password: “password”
[/ruby]
mount_options
オプションをつけないとマウントが失敗します。
自分の環境だと正しいアカウントを書いているつもりなんですけど、起動時に認証情報の入力を求められます・・・。
コメントで教えていただきましたがmount_options
ではなくsmb_username
とsmb_password
を指定すると認証情報なしでログインできます。
訂正情報ありがとうございます!
SMB
AnsibleLocalプロビジョナーでプロビジョンを実行できる
これは普通に実行できました。
詳しくは後述。
認証の設定
今までのboxはbento/centos-7
を使っていたのですが、残念ながらHyper-Vには対応していないので、今回はcentos/7
を使いました。
デフォルトだとsshdでパスワード認証が無効になっているのでパスワード認証を使ってputtyなどからは接続できません。
自分はputtyを使っているのでputtyでのやり方になります。
やり方は2つあります。
秘密鍵でログインする(安全)
Vagrantが自動生成する秘密鍵を直接puttyではロードできないので、puttygenで変換する必要があります。
自分の環境だと秘密鍵の場所は.vagrant/machines/default/hyperv/private_key
でした。
わからない場合はvagrant ssh-config
を実行してIdentityFile
の項目が秘密鍵になります。
puttygenでこの鍵を読み込んで、保存しなおします。
あとはputtyで秘密鍵を読み込んでipを指定すればログインできます。
ちなみにユーザー名はvagrant
でした。
パスワード認証を許可する(お手軽)
sshd設定を修正してパスワード認証を許可するように変更します。
Hyper-Vのコンソールから直接変更してもいいのですが、面倒なのでAnsibleでプロビジョンします。
以下のようなファイルをVagrantfileと同じディレクトリに保存します。
ファイル名はplaybook.yml
としておきます。(変更可能です。)
[python]
- hosts: all
become: yes
tasks:
- lineinfile:
path: /etc/ssh/sshd_config
regexp: ^PasswordAuthentication
line: PasswordAuthentication yes
notify: restart sshd
handlers:
- name: restart sshd
systemd:
name: sshd
state: restarted
[/python]
Vagrantファイルは以下のようにします。
関係のある場所のみ抜粋してます。
[ruby]
# Provision with Ansible
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook.yml"
end
# ansible_localはデフォルトだと`/vagrant`を参照するのでマウントしておく。
config.vm.synced_folder "." , "/vagrant" , type: "smb", smb_username: “username”, smb_password: “password”
[/ruby]
vagrant up
時にプロビジョンされます。任意に実行したい場合はvagrant provision
で実行できます。
まとめ
残念ながらStaticIPを設定することはできなかったのですが、使ってみようかな・・・と思える環境までは持っていくことができました。
NAT環境とStaticIPは必須だと思うので、他にやり方がないかもう少し調査しながら使ってみようと思います。