BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible・git】SSHでリモートレポジトリに接続してcloneする

はじめに

こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。

ここ二年くらいAnsibleやCloudFormationなどの自動化が大好きです。もっといいやり方があるとしてもとりあえず自分の思い描いたように動くと本当に嬉しいですよね!

今回はラズパイのOS設定を自動構築する中で、人認識等を行うプログラム部分のみを別途Gitでバージョン管理すべく、この実装を行っており、初めてgitモジュールを使ったので備忘として実装方法を残しておこうと思います。ちなみにレポジトリにはSSHで接続をします。

Ansibleでgitのcloneをする

f:id:bftnagoya:20210908094105p:plain

前提条件

このPlaybookが全体の中の一部になっているため、GitHubに接続するためのユーザは作成済だったり、ローカルレポジトリのルートディレクトリは作成済だったりします。前提条件は以下の通りです。

Playbookの流れ

絶対に必要なのは、接続情報を記載したconfigファイルと鍵の格納、git cloneの実行です。とはいえ、前提として必要なディレクトリの作成や冪等性を保つための確認を行います。

  1. 「.git」ファイルの確認
    • 既にcloneされていたらもう実行しない
  2. ユーザのホームディレクトリに.sshディレクトリがあるか確認
  3. .sshディレクトリの作成
    • 2の確認時に.sshがなかったら実行
  4. configファイルと秘密鍵をコピー
    • 1の確認時に.gitがなかったら実行
  5. gitの初期化
    • 1の確認時に.gitがなかったら実行
  6. gitのclone
    • 1の確認時に.gitがなかったら実行
  7. 所有者と所有グループの変更
    • 1の確認時に.gitがなかったら実行

実際のPlaybook

個人的にはハードコーディングが好きではないのでいつも変数化するのですが、今回はそのまま記載します。必要に応じてユーザ名やディレクトリを変更してください。

- name: Check if .git file exists.
  become: yes
  shell:
    cmd: ls -l /opt/testuser/source/.git
  register: sourcedir
  ignore_errors: yes

- name: Check if .ssh dir exists.
  become: yes
  shell:
    cmd: ls -l /home/testuser/.ssh
  register: sshdir
  ignore_errors: yes

- name: Create .ssh dir for testuser.
  become: yes
  file:
    path: /home/testuser/.ssh
    state: directory
    mode: '0700'
    owner: testuser
    group: testuser
  when: sshdir.rc != 0

- name: Create config for ssh access to git.
  become: yes
  copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
    owner: testuser
    group: testuser
    mode: "{{ item.mode }}"
    backup: yes
  with_items:
    - { src: config, dest: /home/testuser/.ssh/config, mode: '0644' }
    - { src: gitid_rsa, dest: /home/testuser/.ssh/gitid_rsa, mode: '0600' }
  when: sourcedir != 0

- name: git init.
  become: yes
  shell:
    cmd: cd /opt/testuser/source | git init
  when: sourcedir != 0

- name: git clone.
  become: yes
  git:
    repo: git@gitlab.com:XXXXXXXXXX/source.git
    dest: /opt/testuser/source
    accept_hostkey: true
    key_file: /home/testuser/.ssh/gitid_rsa
  when: sourcedir != 0

- name: chown recurse
  become: yes
  shell:
    cmd: chown testuser:testuser -R /opt/testuser/source
  when: sourcedir != 0

copyモジュールを使用しているので、roles/<ロール名>/files以下にconfigファイルと秘密鍵を置く必要があります。

Host gitlab.com
    HostName gitlab.com
    User <GitHubに接続するユーザ名>
    IdentityFile ~/.ssh/gitid_rsa
    TCPKeepAlive yes
    IdentitiesOnly yes

終わりに

gitモジュールがあるじゃないかぁ!と思ったのもつかの間、あまりやりたいことができず結局copyモジュールやshellモジュールでいろいろやることになりました。

ここまで読んでいただきありがとうございました~ ^ ^