開発チームのコンピューターとCI/CDサーバーから実行されるAnsibleプレイブックを作成しようとしています。
プレイブックのタスクの1つは、プライベートgitリポジトリからプロジェクトのソースコードを取得することです。プレイブックはCI/CDサーバーから実行する必要があるため、SSH転送を使用できません。
私が思いついたのは、必要なSSH秘密鍵をリモートホストマシンにコピーし、その鍵を使用して秘密gitリポジトリからコードを複製することです。
ただし、これを試行すると、クローン作成タスクがハングします。コマンドを手動で起動しようとすると、SSH秘密鍵のパスフレーズが要求されます。 SSHキーはパスフレーズを使用しません(空白)。
誰かがこの(おそらく非常に一般的な)問題の解決策を共有できますか?
誰かが必要とする場合に備えて、これは私の現在のプレイブックです:
- name: Create SSH directory
file: path=/root/.ssh state=directory
- name: Copy SHH key for Git access
copy:
content: "{{ git_ssh_key }}"
dest: /root/.ssh/id_rsa
owner: root
group: root
mode: 0600
# Also tried this, but it also hangs
#- name: Start SSH agent and add SSH key
# Shell: eval `ssh-agent -s` && ssh-add
- name: Get new source from GIT
git:
key_file: /root/.ssh/id_rsa
repo: "[email protected]:user/repo.git"
dest: "{{ staging_dir }}"
depth: 1
accept_hostkey: yes
clone: yes
私は使っている ansible 2.3.1.0, python version = 2.7.12
これを機能させる手順は次のとおりです(Ansible2.3.1およびPython 2.7.10でテスト済み):
パスフレーズなしで新しいSSHキーペアを生成しますssh-keygen -f my_ssh_key -N ''
。
追加 my_ssh_key.pub
リポジトリサーバーのユーザープロファイルに
次のプレイブックでテストします。
_
---
- hosts: localhost
gather_facts: no
vars:
git_ssh_public_key: "Your public ssh key"
git_ssh_key: |
-----BEGIN RSA PRIVATE KEY-----
.... actual key here ....
-----END RSA PRIVATE KEY-----
tasks:
- name: Copy SSH public key file
copy:
content: "{{ git_ssh_public_key }}"
dest: /root/.ssh/id_rsa.pub
mode: 0644
- name: Copy SSH private key file
copy:
content: "{{ git_ssh_key }}"
#src: id_rsa
dest: /root/.ssh/id_rsa
mode: 0600
- name: Get new source from GIT
git:
repo: "[email protected]:user/repo.git"
dest: "/var/www/"
depth: 1
accept_hostkey: yes
clone: yes
重要なセキュリティ通知
この例を実際に使用する場合は、秘密鍵をプレーンテキストで保存しないでください-use Ansible Vault 。
また、[〜#〜] not [〜#〜]rootをansibleユーザーとして使用する必要があります。 Sudo権限なしで新しいユーザーを作成する方が安全です。
問題は、自動化されたタスクの場合、gitがsshキーを使用していないことだと思います。私は(数分間見回して)git 2.10を使用すると、gitを呼び出すときに渡すsshのものを提供できることを読みました。したがって、次のようなことを試すことができると思います。
git -c core.sshCommand='ssh -i /path/to/private/key' fetch Origin
または、使用したい他のコマンド。構成で修正することもできます。
git config core.sshCommand 'ssh -i /path/to/private/key'
とにかく、それが少し役立つことを願っています