zaki work log

作業ログやら生活ログやらなんやら

Ansibleのgitモジュールでgit cloneする (HTTPS / SSH)

adventar.org

Ansible Advent Calendar 2020の12日目の記事とします!


Ansibleのgitモジュールを使ってGitリポジトリからcloneする。

docs.ansible.com

git clone基本

- hosts: localhost
  gather_facts: no

  tasks:
  - name: git clone
    ansible.builtin.git:
      repo: https://github.com/zaki-lknr/usansible.git
      dest: /home/zaki/tmp/dev

これで~/tmp/dev以下にリポジトリがcloneされる。
(usansibleというディレクトリは作成されないが、指定パスは存在しなくても自動で作成される)

(a2.10) [zaki@cloud-dev git (master)]$ ansible-playbook playbook.yml 
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does
not match 'all'

PLAY [localhost] **************************************************************

TASK [git clone] **************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(a2.10) [zaki@cloud-dev git (master)]$ ls -F ~/tmp/dev/
Makefile  README.md  src/

ブランチ・タグ等指定

git clone --branchに相当する指定はversionを使う。

  tasks:
  - name: git clone
    ansible.builtin.git:
      repo: https://github.com/zaki-lknr/usansible.git
      dest: /home/zaki/tmp/dev-1.0.0
      version: usansible-1.0.0

実行後の確認は以下の通り。

(a2.10) [zaki@cloud-dev git (master)]$ cd ~/tmp/dev-1.0.0/
(a2.10) [zaki@cloud-dev dev-1.0.0 ((usansible-1.0.0))]$ ls
README.md  src
(a2.10) [zaki@cloud-dev dev-1.0.0 ((usansible-1.0.0))]$ git branch 
* (HEAD detached at usansible-1.0.0)
  master

認証が必要なリポジトリ

アクセス設定をプライベートにしてる場合などでHTTPSのgit cloneの場合は、ユーザー名とパスワードをリポジトリURLに入れる。

書式はこの通り。
https://username:password@git.repository.host.example.org

  - name: git clone
    ansible.builtin.git:
      repo: https://zaki:curry-daisuki@gitlab-ce.example.org:8443/zaki/tcp-probe-example.git
      dest: /home/zaki/tmp/tcp

ただしこの場合、ansible-playbook -vvvまでverboseオプションを付与するとアクセス先リポジトリURLがログに表示されてしまうので、no_log: trueを使ってログ出力を抑制するのが望ましい。
(エラーの場合も出力されないので、動作確認出来た後に設定すると良い)

  - name: git clone
    ansible.builtin.git:
      repo: https://zaki:curry-daisuki@gitlab-ce.example.org:8443/zaki/tcp-probe-example.git
      dest: /home/zaki/tmp/tcp
    no_log: true

ansible-playbook playbook.yml -vvvを実行すると以下の通り。

ok: [localhost] => changed=false 
  censored: 'the output has been hidden due to the fact that ''no_log: true'' was specified for this result'

ちなみに、パスワードに@を含んでいる場合は、username:password@urlという書式を期待通り認識してくれないため、URLエンコード(@であれば%40に変換)して記載する。

インベントリなどの変数使用時であればJinja2フィルターのurlencode()が使用可能。

tekunabe.hatenablog.jp

jinja.palletsprojects.com

SSHでclone

SSH用のリポジトリパスを設定すれば「ansible-playbook実行ユーザーで元々SSHでgit clone設定できるように~/.ssh/configや鍵設定が済んでいれば」そのままclone可能。

  - name: git clone
    ansible.builtin.git:
      repo: ssh://git@gitlab-ce.example.org:25022/zaki/tcp-probe-example.git
      dest: /home/zaki/tmp/tcp3

鍵ファイルを別途playbookから設定する場合はkey_fileを指定する。

  - name: git clone
    ansible.builtin.git:
      repo: ssh://git@gitlab-ce.example.org:25022/zaki/tcp-probe-example.git
      dest: /home/zaki/tmp/tcp3
      key_file: /home/zaki/.ssh/id_rsa_gitlab

known_hosts未登録

  stderr: |-
    Cloning into '/home/zaki/tmp/tcp2'...
    Host key verification failed.
    fatal: Could not read from remote repository.
  
    Please make sure you have the correct access rights
    and the repository exists.

鍵設定が正しくない場合だけでなく、known_hostsに追加されていない場合も上記のエラーになる。
この場合はaccept_hostkey: trueを追加すれば、自動追加されて動作する。

  - name: git clone
    ansible.builtin.git:
      repo: ssh://git@gitlab-ce.example.org:25022/zaki/tcp-probe-example.git
      dest: /home/zaki/tmp/tcp2
      key_file: /home/zaki/.ssh/id_rsa_gitlab
      accept_hostkey: true

環境

確認した環境は以下の通り。

(a2.10) [zaki@cloud-dev git (master)]$ ansible-playbook --version
ansible-playbook 2.10.2
  config file = /home/zaki/src/ansible-sample/git/ansible.cfg
  configured module search path = ['/home/zaki/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/zaki/src/ansible-sample/venv/a2.10/lib64/python3.6/site-packages/ansible
  executable location = /home/zaki/src/ansible-sample/venv/a2.10/bin/ansible-playbook
  python version = 3.6.8 (default, Oct 13 2020, 16:18:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]