使用Ansible从GitHub的私人仓库中进行git克隆的方法
经过
我想要使用Ansible在AWS的EC2上创建的服务器上部署Rails应用程序。
由于不想公开应用程序,因此GitHub仓库设置为私有。
尽管使用了Ansible的git模块,但由于权限问题无法进行部署。
Permission denied (publickey).
简介

创建令牌
GitHubにて、Settings → Developer settings → Personal access tokens にアクセス
下記権限でトークンを作成
・repo
・admin:public_key
・user
・admin:gpg_key
生成加密令牌的密码
- Ansible Serverの任意のディレクトリに、暗号化したパスワードファイルを設置
echo "トークンの暗号化のパスワード(任意)" | openssl aes-256-cbc -a -salt > "任意のディレクトリ"/password_file.txt
对令牌进行加密处理。
- 下記を実行
ansible-vault encrypt_string 'GitHubで作成したトークン' --name 'GITHUB_ACCESS_TOKEN' --vault-password-file=任意のディレクトリ/password_file.txt
-
- 実行結果を控えておく
- ※Ansibleでplaybookを実行する際に、変数として値を渡します。
[ec2-user@hogehoge]$ ansible-vault encrypt_string 'your_access_token' --name 'GITHUB_ACCESS_TOKEN' --vault-password-file=任意のディレクトリ/password_file.txt
#コピー開始位置
GITHUB_ACCESS_TOKEN: !vault |
$ANSIBLE_VAULT;1.1;AES256
37303661663935393637373662313430353138353563653732343833393563643239303365356633
6336356666626239353061326532343234393233656462640a653233306363326166386438663837
61616136376566643633663532656537646163646462616535356433653538313264313164363535
3361643662343934310a363634626133643930306332333166663138653532353164346631626663
63636335376661636439376332623339366539373938623537396234333939313462 #コピー終了位置
Encryption successful
③其他的方式
-
- Ansibleのconfigにて、valitコマンドで暗号化した場合のパスワードファイルを指定
- ※毎度パスワードを指定しなくてもいいのでCI向き
#defaults配下に下記を追加
vault_password_file = $HOME/ansible/roles/git_clone/password/password_file.txt
ansible-vault encrypt_string 'GitHubで作成したトークン' --name 'GITHUB_ACCESS_TOKEN'
执行Playbook从4到8
- Playbook実行用に、下記変数を定義
KEY_TITLE: GitHub アカウントに追加する SSH キーのタイトル
KEY_PATH: SSH キーを格納するディレクトリの絶対パス
GIT_REPO: クローンする GitHub リポジトリの SSH URL
GIT_BRANCH: クローン後に切り替えたいブランチ
CLONE_DEST: リポジトリのクローン先となるディレクトリ
KNOWN_HOSTS_PATH: APP Server の SSH known_hostsファイルの場所
GIT_EXECUTABLE: ターゲットマシン上のgitバイナリの場所 ※bash -lcやsourceで読み込んでいる場合は不要
GITHUB_ACCESS_TOKEN: 先ほどコピーしたもの
- playbookもしくは、rolesなどで分けたファイルに下記を追記
#----------------------------------------
#5 SSHキーペアを作成
#----------------------------------------
- name: Check if SSH key is already present
stat:
path: "{{ KEY_PATH }}"
register: key_stat_result
- name: Generate SSH key for accessing GitHub
command: "ssh-keygen -t rsa -f {{ KEY_PATH }} -N ''"
when: not key_stat_result.stat.exists
- name: Get key content
command: "cat {{ KEY_PATH }}.pub"
register: key_content
- name: Check if known_host exists
stat:
path: "{{ KNOWN_HOSTS_PATH }}"
register: known_hosts_stat
- name: Create known_hosts if it doesn't exist
file:
path: "{{ KNOWN_HOSTS_PATH }}"
state: touch
when: not known_hosts_stat.stat.exists
- name: Get the content of known hosts
shell: "cat {{ KNOWN_HOSTS_PATH }} | grep github.com"
register: host_stat
failed_when: host_stat.rc > 1
#----------------------------------------
#6 known hostsにGitHubの公開鍵を登録
# GitHub公開鍵を登録することで、SSH初回接続で対話式になるのを回避
#----------------------------------------
- name: Modify known hosts
block:
- name: Fetch GitHub public key
command: ssh-keyscan -T 10 github.com
register: keyscan
- name: Add GitHub public key to ssh known_hosts
lineinfile:
path: "{{ KNOWN_HOSTS_PATH }}"
create: yes
line: "{{ item }}"
with_items: '{{ keyscan.stdout_lines }}'
when: host_stat.rc == 1
- name: Git Clone directory created
become: yes
file:
path: "/var/www"
state: directory
owner: "{{user_name}}"
group: "{{user_name}}"
mode: "775"
#----------------------------------------
#7 SSHの公開鍵をGitHubに登録
#----------------------------------------
- name: Add SSH public key to GitHub account
uri:
url: https://api.github.com/user/keys
validate_certs: no
method: POST
body:
title: "{{ KEY_TITLE }}"
key: "{{ key_content.stdout }}"
body_format: json
headers:
Content-Type: "application/json"
Authorization: "token {{ GITHUB_ACCESS_TOKEN }}"
register: task_log
failed_when: task_log.content.find('key is already in use') == 0
#----------------------------------------
#8 git clone
#----------------------------------------
- name: Clone the repository
shell: GIT_SSH_COMMAND="ssh -i {{ KEY_PATH }} -v -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" {{ GIT_EXECUTABLE }} clone {{ GIT_REPO }} {{ CLONE_DEST }}
对于实施后的感受
在使用公共存储库克隆时,确实更方便。
在使用CircleCI等部署工具时,需要填写令牌,这在安全方面令人担心。
参考网站