Ansible
fujitsu
adventcalendar2017
FUJITSUDay 11

ansibleでリモート側にある複数のzipファイルを展開する方法

More than 1 year has passed since last update.

これは FUJITSU Advent Calendar 2017 11日目の記事です。
皆さんがっつり書いてますが私は軽めです。

unarchive機能のおさらい

ansibleでリモートマシン上に圧縮ファイルを展開する方法としてunarchiveというモジュールがありますが、これはansibleの管理マシン上にある圧縮ファイルを送って展開するというのがデフォルトの動きです。

- name: Extract foo.tgz into /var/lib/foo
  unarchive:
    src: foo.tgz
    dest: /var/lib/foo

公式マニュアルより引用

リモートマシン上に既に置いてあるzipファイルを展開するためにはremote_src: yesというオプションをつけます。

- name: Unarchive a file that is already on the remote machine
  unarchive:
    src: /tmp/foo.zip
    dest: /usr/local/bin
    remote_src: yes

公式マニュアルより引用

でもですね、zipファイル名なんてずっと同じか分からんのですよ。
zipファイル増えるかもしれんのですよ。

結局どうやるか

そういった場合はどうするかというと、その場でファイルリストを作ってループします。

- name: filelist of Hoge test set
  shell: chdir=/home/hoge/testset/zipfiles find `pwd` | grep .zip
  register: filelist
- name: unzip Hoge test set
  unarchive:
    remote_src: yes
    src: "{{ item }}"
    dest: "/home/hoge/testset/SRC"
  with_items: "{{ filelist.stdout_lines }}"

今更ながら2行目のshellのところは、もうちょっと改良の余地ありかも。

余談

見てのとおりテストセットをサーバに展開するときにこれをやってました。
なんでわざわざzipに固めてたかというと、転送のスピードが全然違うためです。
zipがテストセットのリポジトリ(ファイルサーバじゃないよ)にあって、それをチェックアウトしてくるという処理が上記の前段にあります。

組織的にですね、Interstage Application Development Cycle Managerを使ってリソース管理していたもので、
こんな感じのチェックアウト処理です。

- name: check out Hoge test set
  command: chdir=/home/hoge creates=/home/hoge/testset {{ escm_path }}/escm co -s {{ escm_server }} -d {{ escm_repository }} -p {{ escm_project }} -r {{ escm_release }} -c {{ escm_branch }} -i zipfiles -q
  environment: "{{ env }}"

gitならソースをベタで登録してもチェックアウト速いんだろうなー。