Ansible Advent Calendar 2020の12日目の記事とします!
Ansibleのgit
モジュールを使ってGitリポジトリからcloneする。
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()
が使用可能。
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)]