Vagrant/Ansibleを使って、GitHubリポジトリからcloneするタスクを自動化してみました。
基本的な設定は前回の記事「VagrantでAnsibleを使ってOracle JDKインストールを自動化する」と同じですので、そちらも参照してください。
デプロイ用鍵の作成 (任意)
今回、Ansible/GitHub用に鍵github_deployを作成しました。
$ ssh-keygen -q -f ~/.ssh/github_deploy Enter passphrase (empty for no passphrase): Enter same passphrase again:
作成した鍵はいつものように、GitHubに追加しておきます。
ssh-agentの起動と鍵の追加
あらかじめ、VMホスト側でssh-agentを起動しておきます。
$ ssh-agent
次に、鍵をエージェントに追加しておきます。ちなみに、id_rsaならssh-addだけでもOKです。
$ ssh-add ~/.ssh/github_deploy Identity added: /Users/safx/.ssh/github_deploy (/Users/safx/.ssh/github_deploy)
ssh-add -lで鍵が追加されているかを確認しておきます。
$ ssh-add -l 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /Users/safx/.ssh/github_deploy (RSA)
Vagrantの設定
Vagrantで、ゲストOSからのエージェントフォワーディングを有効にするためにVagrantfileに次のように書きます。
config.ssh.forward_agent = true
プレイブックへのタスク追加
Ansibleのplaybook.xmlには次のようなタスクを追加します。
- name: clone github repos tags: github git: repo=git@github.com:UserName/SomeRepo.git dest=/home/vagrant/someRepo accept_hostkey=True sudo: False
GitHubに接続するときに自動で接続するためにaccept_hostkey=Trueとしています。また、rootだとforward_agentの設定が効かないっぽいのでsudo: Falseしています。
プレイブックの実行
各種設定が済んだら、ansible-playbookでプレイブックを実行します。
$ ANSIBLE_SSH_ARGS="-o ForwardAgent=yes" ansible-playbook -i vagrant_ansible_inventory_node1 --private-key=~/.vagrant.d/insecure_private_key -u vagrant playbook.yml -t github
:
TASK: [clone github repo] *****************************************************
changed: [node1]
PLAY RECAP ********************************************************************
node1 : ok=1 changed=1 unreachable=0 failed=0
無事実行されて、ユーザvagrantのホームにリポジトリがクローンされました。
$ vagrant ssh Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686) * Documentation: https://help.ubuntu.com/ Welcome to your Vagrant-built virtual machine. Last login: Fri Mar 7 17:52:45 2014 from 10.0.2.2 vagrant@precise32:~$ ls postinstall.sh someRepo
ちなみに、ansible-docによると、ansibleのgitコマンドにはssh_optsがあるのですが、手元のansible 1.5ではssh_opts='-o ForwardAgent=yes'が効きませんでしたので、かわりにANSIBLE_SSH_ARGSを使っています。
vagrant provisionからの実行
前述のANSIBLE_SSH_ARGSの代わりに、playbook.xmlと同じ場所に次のようなansible.cfgを作成する方法もあります。
[ssh_connection] ssh_args="-o ForwardAgent=yes"
ansible.cfgを用意しておけばvagrant provisionだけでプロビジョニングが可能になります。
$ vagrant provision
Permission denied (publickey)
ssh関連でエラーが起こる場合には、まず、ホスト側でssh-agentが利用できるようになっているかを確認しましょう。
ssh -T git@github.comで接続を確認できます。成功する場合には次のように表示されます。
$ ssh -T git@github.com
:
Hi <User>! You've successfully authenticated, but GitHub does not provide shell access.
ssh-agentが起動していない、または起動しているがキーが追加されていない、GitHub側の設定にキーがないなどのときには次のエラーになるはずです。
$ ssh -T git@github.com Permission denied (publickey).
GitHubのヘルプページも参照してください。


0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。