22
18

More than 5 years have passed since last update.

Ansibleのmakeモジュールやunarchiveモジュールを使ってGitをソースからインストールしてみる

Last updated at Posted at 2016-07-03

■ はじめに

  • Ansibleとは
    Ansibleについて簡単に紹介しておきます。

    • エージェントレスでサーバ構築を自動化してくれるツールです。
    • sshdが動作しているマシンにSSHで接続し環境を構築してくれます。
    • 設定ファイルはYAMLで書きます。プログラムの知識(Ruby、Python、etc.)は不要です。
    • 数台~数十台規模のサーバ構築だったらchef, puppetよりも簡単です。

     

  • makeモジュール
    makeモジュールは、Ansible ver.2.1から追加された新機能です。
     make - Run targets in a Makefile
     

  • 環境の準備
    以前の記事を参照してください。
     Ansible 最初の一歩
    Gitを手動でソースからインストールする方法は下記の記事を参照してください。
     最新のGit(ver.2.9)をソースからインストールする

■ GitをソースからインストールするPlayBook

  • バージョンを指定できるようにしました。
  • インストールする場所を指定できるようにしました。
  • 既に同じバージョンのGitがインストールされている場合はタスクをスキップします。
  • Ansible ver.2.1の新機能、makeモジュールを利用してみました。
playbook.yml
---
- hosts: all
  remote_user: ec2-user
  become: true
  vars:
    version: 2.9.0
    prefix_dir: /usr/local
    src_dir: "{{ prefix_dir }}/src"
    bin_dir: "{{ prefix_dir }}/bin"
  tasks:
    - name: original git exist check
      stat: path={{ bin_dir }}/git
      register: exist_git

    - debug: msg="git not installed."
      when: exist_git.stat.exists == false

    - name: original git version check
      command: "{{ bin_dir }}/git --version warn=false"
      register: org_version
      changed_when: false
      when: exist_git.stat.exists == true

    - name: install dependences
      yum: name={{ item }}
      with_items:
        - curl-devel
        - expat-devel
        - gettext-devel
        - openssl-devel
        - zlib-devel
        - gcc
        - perl-ExtUtils-MakeMaker
      when: (exist_git.stat.exists == false) or
            (exist_git.stat.exists == true and org_version.stdout != "git version {{ version }}")

    - name: make download dir
      file: path={{ src_dir }} state=directory owner=root group=root mode=755
      when: (exist_git.stat.exists == false) or
            (exist_git.stat.exists == true and org_version.stdout != "git version {{ version }}")

    - name: download git version {{ version }}
      unarchive:
        src: https://www.kernel.org/pub/software/scm/git/git-{{ version }}.tar.gz
        dest: "{{ src_dir }}"
        copy: no
      when: (exist_git.stat.exists == false) or
            (exist_git.stat.exists == true and org_version.stdout != "git version {{ version }}")

    - name: make all
      make:
        chdir: "{{ src_dir }}/git-{{ version }}"
        target: all
        params:
          prefix: "{{ prefix_dir }}"
      when: (exist_git.stat.exists == false) or
            (exist_git.stat.exists == true and org_version.stdout != "git version {{ version }}")

    - name: make install
      make:
        chdir: "{{ src_dir }}/git-{{ version }}"
        target: install
        params:
          prefix: "{{ prefix_dir }}"
      when: (exist_git.stat.exists == false) or
            (exist_git.stat.exists == true and org_version.stdout != "git version {{ version }}")

実行は以下になります。

$ ansible-playbook playbook.yml

備考

  • commandモジュールでgit --versionしていますが、Ansibleのデフォルトの動作では、gitモジュールを利用するように警告されます。Ansibleのgitモジュールには、executableのバージョンを取得するパラメータがありません。そこで、今のところはcommandモジュールを利用してバージョンを取得し、warn=falseを指定してgitモジュールの利用を促す警告を消しています。
    Source Control Modules - git(リンク

  • whenの同じ条件判断の繰り返し部分は、set_factモジュールを使って変数に格納すればよりスマートです。

  • becomeとPATHの取り扱いについては、以下の記事を参考にしてください。
     Ansibleのenvironmentを利用して「sudo su -」相当のPATHを設定する

■ makeモジュールとchanged について

Ansibleのmakeモジュールは、そのまま実行すると毎回chengedになってしまいます。
PlayBookを最初に実行したときはchangedになってほしいですが、同じPlayBookを再実行したときはchangedではなくokになってほしいところです。
とはいえ、changed_when: Falseを指定しまうと、初回実行時に変更が加わっているのにokになってしまうのでchanged_when: Falseの指定も避けたいところです。
そこで、今回は、registerwhenを組み合わせたバージョンチェック機能を入れてみました。

■ unarchiveモジュールとhttpsの組み合わせについて

unarchivehttpsの組み合わせが曲者でした。
Amazon Linuxでは問題なく動作していましたが、プロキシが認証する環境ではプロキシを設定しても動作しませんでした。おそらく、原因はSSL証明書を無効にする指定をしていないから。
unarchiveモジュールには、validate_certsオプションがあり、validate_crets=noを指定すればOKなのですが、このオプションは、Ansible ver.2.2以降でないとサポートされていません。
Ansible ver.2.1以前の環境では、get_urlhttpsvalidate_crets=noの組み合わせでダウンロードする必要がありました。

■ おわりに

今回は、Gitをソースからインストールしてみましたが、rpmで公開されていないパッケージをソースからインストールする場合は、このPlayBookを応用できそうです。

それでは。

22
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
18