2014/03/11

VagrantゲストOSからのGitHubソース取得をAnsibleで自動化する方法について

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 件のコメント:

コメントを投稿

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