クラウド上にIaC(Infrastructure as Code)、TerraformとAnsibleを利用してネットワークとインスタンスを自動構築させる中で、Githubプライベートリポジトリのコードを取得する必要があり、以下の方法で実現した。どなたかの参考になれば幸いです。
前提条件
以下がインストール済であること
- Ansible 2.7.7
- Git 1.2.20
テスト環境
- Debian 10 (GCEのVMインスタンス)
- Mac
Github Access Tokenの取得
-
Settings -> Developer Settings -> Personal access tokens
へ移動 -
Generate new token
で新規鍵を生成 - 表示されるAccess Tokenを書き留める。作成された直後の一度しか表示されない。書き留め忘れた場合は再生成してください。
ansible-pullを利用して取得
最終版のgistはここです。ファイルが2つありますが、ここではコードの詳細な説明をしていきます。
cmd.sh
ansible-pull -e 'ansible_python_interpreter=/usr/bin/python3' \
-U https://<上記で取得したGithub Access Token>:x-oauth-basic@github.com/<組織名>/<プライベートリポジトリ名> \
-d /tmp/<プライベートリポジトリ名> ./local.yml
-
ansible_python_interpreter
ですが、環境によってPython
がインストールされるディレクトリが異なるかと思います。Ansible
はデフォルトだと/usr/bin/phthon
を見に行ってしまうので、何も指定しないと、実行時にエラーが表示されることがあります。必要であればこのように利用するバイナリの場所を指定してあげます。 -
Github Access Token
を指定する部分は、セキュリティ的によろしくないので、直にトークンを書き込むのではなく、環境変数などに詰めて渡してください。 - 組織名のところですが、組織でない場合、ここは個人名でもいけるのかは試していません。
-
-d /tmp/<プライベートリポジトリ名>
の部分は、出力先の任意のディレクトリを指定してあげてください。上の例では便宜上、tmpディレクトリの下に展開しているだけです。
local.yml
---
- hosts: all
vars:
ansible_python_interpreter: /usr/bin/python3
become: true
become_method: sudo
-
ansible-pull
は何かしらAnsibleのプレイブックが必要なので、ここではダミーとしてlocal.yml
を渡しています。中身は何も実行しないのであればどんな記述でも構いません。
###おまけ
Ansible, Terraformで上記のコードを利用する場合、値を環境変数に設定する必要があるとおもうが、参考として取得方法を以下にメモしておきます。
Ansibleでの環境変数取得方法
ansible_env
で値が取れる。例えばimage_id
という環境変数が設定されていれば、ansible_env.image_id
として取得できる。
公式資料 : Module Index
Terraformでの環境変数取得方法
TF_VAR_名前
、例えばTF_VAR_image_id
というように設定すると、環境変数として、*.tf
ファイル内部でvar.image_id
という形で取得できる。
公式資料 : 環境変数の設定方法