Ansible で PHP 環境構築 ② - vim インストール -

seven-greenz.hatenablog.com

の続きです。 ゲスト OS ( CentOS) に最新の vim をインストールしました。

最新の vim インストール用プレイブック

playbook.yml

    # Ansible が標準で提供しているモジュールには基本的に冪等性があります。冪等性については後述
    # shell モジュールは冪等性がありません。
    # 下の install vim タスクで shell モジュールを使用しているためプロビジョニング毎に処理を実行してしまい無駄に処理時間が長くなってしまいます。
    # そのため is vim installed タスクで vim --version の返却値を登録しておき install vim タスクでチェックして vim --version が失敗した場合はインストールをスキップしています。
    - name: is vim installed
      shell: /usr/local/bin/vim --version
      register: is_vim_installed
      # 初回実行時に発生する vim が見つからない異常終了を無視して処理を続行します。
      ignore_errors: True
      # 本タスク自体も shell モジュールを指定しているため毎回 changed が出力されます
      # 無用な混乱をもたらしそうであり、環境を変えるコマンドではないことがわかっているため changed は出力しないようにします。
      changed_when: False

    # lua 付きの vim でないと使えないプラグインがあるため。ただ最新の vim をインストールするだけでは必ずしも必要ではないかと思います。
    # vimの依存パッケージインストール
    - name: install dependency packeges
      yum:
        name: "{{ item }}"
        state: latest
      with_items:
        - lua-devel
        - ncurses-devel

    - name: download vim
      git:
        repo: 'https://github.com/vim/vim.git'
        dest: /usr/src/vim

    - name: install vim
      # --prefix: インストール先
      shell: "{{ item }}"
      args:
        chdir: /usr/src/vim
      with_items:
        - make distclean
        - ./configure --prefix=/usr/local --enable-multibyte --with-features=huge --disable-selinux --enable-pythoninterp=yes --enable-luainterp=yes
        - make
        - make install
      when: is_vim_installed|failed
    - shell: /usr/local/bin/vim --version
      register: vim_version
      changed_when: False
    # register で登録された値の構成
    # http://qiita.com/szk3/items/29e827f90a543c764a5e
    - debug: var=vim_version.stdout_lines[0]

プロビジョニングの結果、8.0 の vim がインストールされました。

TASK [debug] *******************************************************************
ok: [simple] => {
    "changed": false,
    "vim_version.stdout_lines[0]": "VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May 13 2017 18:36:55)"
}

ソースコードこちらです。

冪等性について

上の install dependency packeges タスクは yum モジュールを使用していて初回実行時と 2 回目以降では結果が違います。 詳しいことはわかりませんが、2 回目以降はok が出力されていて変わっていないことが保証されています。

  • 初回
TASK [install dependency packeges] *********************************************
changed: [simple] => (item=[u'lua-devel', u'ncurses-devel'])
  • 2 回目以降
TASK [install dependency packeges] *********************************************
ok: [simple] => (item=[u'lua-devel', u'ncurses-devel'])

それに対して shell モジュールを使用している vim install タスクは何回やっても changedが出力されるため実行する度に環境が変わってしまっている可能性があります。

  • 初回、2 回目以降
TASK [install vim] *************************************************************
changed: [simple] => (item=make distclean)
changed: [simple] => (item=./configure --prefix=/usr/local --enable-multibyte --with-features=huge --disable-selinux --enable-pythoninterp=yes --enable-luainterp=yes)
changed: [simple] => (item=make)
changed: [simple] => (item=make install)