はじめに
こんにちは!
BFT名古屋支店・インフラ女子(?)のやまぐちです。
ここ二年くらいAnsibleやCloudFormationなどの自動化が大好きです。もっといいやり方があるとしてもとりあえず自分の思い描いたように動くと本当に嬉しいですよね!
今回はラズパイのOS設定を自動構築する中で、人認識等を行うプログラム部分のみを別途Gitでバージョン管理すべく、この実装を行っており、初めてgitモジュールを使ったので備忘として実装方法を残しておこうと思います。ちなみにレポジトリにはSSHで接続をします。
Ansibleでgitのcloneをする
前提条件
このPlaybookが全体の中の一部になっているため、GitHubに接続するためのユーザは作成済だったり、ローカルレポジトリのルートディレクトリは作成済だったりします。前提条件は以下の通りです。
Playbookの流れ
絶対に必要なのは、接続情報を記載したconfigファイルと鍵の格納、git cloneの実行です。とはいえ、前提として必要なディレクトリの作成や冪等性を保つための確認を行います。
- 「.git」ファイルの確認
- 既にcloneされていたらもう実行しない
- ユーザのホームディレクトリに.sshディレクトリがあるか確認
- .sshディレクトリの作成
- 2の確認時に.sshがなかったら実行
- configファイルと秘密鍵をコピー
- 1の確認時に.gitがなかったら実行
- gitの初期化
- 1の確認時に.gitがなかったら実行
- gitのclone
- 1の確認時に.gitがなかったら実行
- 所有者と所有グループの変更
- 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モジュールでいろいろやることになりました。
ここまで読んでいただきありがとうございました~ ^ ^