【Ansible Tower/AWX】圧縮ファイル解凍部品


この記事はプロモーションを含みます。

Ansible

zip形式で圧縮されたファイルを解凍する部品を作成したので公開したいと思います。

概要

下記のような、2種類のファイルを解凍することが可能です。
また、ファイル名のフォルダを作成し、そこに解凍することも可能です。

フォルダごと圧縮したパターン

フォルダを選択して圧縮し、zipファイル直下にzipファイル名と同じ名称のフォルダがあるパターンです。

TestFolder1.zip
 └ TestFolder1(フォルダ)
     ├ 20210201.log(ファイル)
     ├ 20210202.log(ファイル)
     └ 20210203.log(ファイル)

ファイルを圧縮したパターン

ファイルを選択して圧縮し、zipファイル直下にファイルがあるパターンです。

TestFolder2.zip
    ├ 20210201.log(ファイル)
    ├ 20210202.log(ファイル)
    └ 20210203.log(ファイル)

ソースコード

今回ご紹介する部品のソースコードになります。

---
###############################################################
#  機能名        :圧縮ファイル解凍部品
#  プレイブック名:pt_unarchive.yml
#  機能概要      :被管理サーバに格納されている圧縮ファイルを解凍する
#  実行形式      :import_tasks: parts/pt_unarchive.yml
#  引数          :[必須]src_path[path]:解凍対象圧縮ファイル格納パス
#                :[必須]src_file[file]:解凍対象圧縮ファイル名
#                :[必須]dist_path[path]:解凍先
#                :[任意]mkdir[boolean]:解凍対象圧縮ファイル名のフォルダを作成要否
###############################################################

- name: "圧縮ファイル[{{ src_file }}]の解凍(フォルダ作成なし)"
  unarchive:
    src: "{{ src_path }}/{{ src_file }}"
    dest: "{{ dest_path }}/"
    remote_src: yes
  when: not mkdir or mkdir is not defined

- block:
  - name: "解凍先ディレクトリ名の取得"
    vars:
      dest_dir: "{{ src_file.split('.') }}"
    set_fact: dest_dir="{{ dest_dir[0] }}"

  - name: "解凍先ディレクトリの作成"
    file:
      path: "{{ dest_path }}/{{ dest_dir }}"
      state: directory

  - name: "圧縮ファイル[{{ src_file }}]の解凍(フォルダ作成あり)"
    unarchive:
      src: "{{ src_path }}/{{ src_file }}"
      dest: "{{ dest_path }}/{{ dest_dir }}"
      remote_src: yes
  when: mkdir is defined and mkdir

使用方法

解凍先のディレクトリを作成する・作成しないの2パターンを説明していきたいと思います。
引数[mkdir]をtrue(作成する)、false(作成しない)のどちらかを指定することで制御可能です。
省略することも可能で、その場合は「false」として処理されます。

解凍先のディレクトリを作成する

圧縮ファイルの解凍時、解凍先に圧縮ファイル名から拡張子を除いたディレクトリを作成し、その先に解凍を行います。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: "圧縮ファイルの解凍(解凍先ディレクトリを作成する)"
    import_tasks: parts/pt_unarchive.yml
    vars:
      src_path: /home/test_unarchive
      src_file: TestFolder2.zip
      dest_path: /home/test_unarchive
      mkdir: true

解凍先のディレクトリを作成しない

圧縮ファイルの解凍時、指定した解凍先に直接解凍を行います。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: "圧縮ファイルの解凍(解凍先ディレクトリを作成しない)"
    import_tasks: parts/pt_unarchive.yml
    vars:
      src_path: /home/test_unarchive
      src_file: TestFolder2.zip
      dest_path: /home/test_unarchive
      mkdir: false

実行結果

下記の4パターンの実行時のログとTeraTermで[ls]コマンドを実行した結果になります。
*使用したzipファイルは「概要」欄に記載した構成のものになります。

  1. フォルダごと圧縮し、解凍先のディレクトリを作成する
  2. フォルダごと圧縮し、解凍先のディレクトリを作成しない
  3. ファイルを圧縮し、解凍先のディレクトリを作成する
  4. ファイルを圧縮し、解凍先のディレクトリを作成しない

1.フォルダごと圧縮し、解凍先のディレクトリを作成する

Ansible AWX 実行ログ
Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [圧縮ファイル[TestFolder1.zip]の解凍(フォルダ作成なし)] ************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [解凍先ディレクトリ名の取得] ***********************************************************
ok: [192.168.56.105] => {"ansible_facts": {"dest_dir": "TestFolder1"}, "changed": false}

TASK [解凍先ディレクトリの作成] ************************************************************
changed: [192.168.56.105] => {"changed": true, "gid": 1000, "group": "awx", "mode": "0775", "owner": "awx", "path": "/home/test_unarchive/TestFolder1", "size": 6, "state": "directory", "uid": 1000}

TASK [圧縮ファイル[TestFolder1.zip]の解凍(フォルダ作成あり)] ************************************
changed: [192.168.56.105] => {"changed": true, "dest": "/home/test_unarchive/TestFolder1", "extract_results": {"cmd": ["/usr/bin/unzip", "-o", "/home/test_unarchive/TestFolder1.zip", "-d", "/home/test_unarchive/TestFolder1"], "err": "", "out": "Archive:  /home/test_unarchive/TestFolder1.zip\\n extracting: /home/test_unarchive/TestFolder1/TestFolder1/20210201.log  \\n extracting: /home/test_unarchive/TestFolder1/TestFolder1/20210202.log  \\n extracting: /home/test_unarchive/TestFolder1/TestFolder1/20210203.log  \\n", "rc": 0}, "gid": 1000, "group": "awx", "handler": "ZipArchive", "mode": "0775", "owner": "awx", "size": 25, "src": "/home/test_unarchive/TestFolder1.zip", "state": "directory", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=3    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
TeraTerm lsコマンド
[root@SYUTAKUWEB01 test_unarchive]# ls -R1
.:
TestFolder1.zip
TestFolder1

./TestFolder1:
TestFolder1

./TestFolder1/TestFolder1:
20210201.log
20210202.log
20210203.log

2.フォルダごと圧縮し、解凍先のディレクトリを作成しない

Ansible AWX 実行ログ
Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [圧縮ファイル[TestFolder1.zip]の解凍(フォルダ作成なし)] ************************************
changed: [192.168.56.105] => {"changed": true, "dest": "/home/test_unarchive/", "extract_results": {"cmd": ["/usr/bin/unzip", "-o", "/home/test_unarchive/TestFolder1.zip", "-d", "/home/test_unarchive/"], "err": "", "out": "Archive:  /home/test_unarchive/TestFolder1.zip\\n extracting: /home/test_unarchive/TestFolder1/20210201.log  \\n extracting: /home/test_unarchive/TestFolder1/20210202.log  \\n extracting: /home/test_unarchive/TestFolder1/20210203.log  \\n", "rc": 0}, "gid": 1000, "group": "awx", "handler": "ZipArchive", "mode": "0755", "owner": "awx", "size": 71, "src": "/home/test_unarchive/TestFolder1.zip", "state": "directory", "uid": 1000}

TASK [解凍先ディレクトリ名の取得] ***********************************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [解凍先ディレクトリの作成] ************************************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [圧縮ファイル[TestFolder1.zip]の解凍(フォルダ作成あり)] ************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
TeraTerm lsコマンド
[root@SYUTAKUWEB01 test_unarchive]# ls -R1
.:
TestFolder1.zip
TestFolder1

./TestFolder1:
20210201.log
20210202.log
20210203.log

3.ファイルを圧縮し、解凍先のディレクトリを作成する

Ansible AWX 実行ログ
Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [圧縮ファイル[TestFolder2.zip]の解凍(フォルダ作成なし)] ************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [解凍先ディレクトリ名の取得] ***********************************************************
ok: [192.168.56.105] => {"ansible_facts": {"dest_dir": "TestFolder2"}, "changed": false}

TASK [解凍先ディレクトリの作成] ************************************************************
changed: [192.168.56.105] => {"changed": true, "gid": 1000, "group": "awx", "mode": "0775", "owner": "awx", "path": "/home/test_unarchive/TestFolder2", "size": 6, "state": "directory", "uid": 1000}

TASK [圧縮ファイル[TestFolder2.zip]の解凍(フォルダ作成あり)] ************************************
changed: [192.168.56.105] => {"changed": true, "dest": "/home/test_unarchive/TestFolder2", "extract_results": {"cmd": ["/usr/bin/unzip", "-o", "/home/test_unarchive/TestFolder2.zip", "-d", "/home/test_unarchive/TestFolder2"], "err": "", "out": "Archive:  /home/test_unarchive/TestFolder2.zip\\n extracting: /home/test_unarchive/TestFolder2/20210201.log  \\n extracting: /home/test_unarchive/TestFolder2/20210202.log  \\n extracting: /home/test_unarchive/TestFolder2/20210203.log  \\n", "rc": 0}, "gid": 1000, "group": "awx", "handler": "ZipArchive", "mode": "0775", "owner": "awx", "size": 66, "src": "/home/test_unarchive/TestFolder2.zip", "state": "directory", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=3    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
TeraTerm lsコマンド
[root@SYUTAKUWEB01 test_unarchive]# ls -R1
.:
TestFolder2.zip
TestFolder2

./TestFolder2:
20210201.log
20210202.log
20210203.log

4.ファイルを圧縮し、解凍先のディレクトリを作成しない

Ansible AWX 実行ログ
Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [圧縮ファイル[TestFolder2.zip]の解凍(フォルダ作成なし)] ************************************
changed: [192.168.56.105] => {"changed": true, "dest": "/home/test_unarchive/", "extract_results": {"cmd": ["/usr/bin/unzip", "-o", "/home/test_unarchive/TestFolder2.zip", "-d", "/home/test_unarchive/"], "err": "", "out": "Archive:  /home/test_unarchive/TestFolder2.zip\\n extracting: /home/test_unarchive/20210201.log  \\n extracting: /home/test_unarchive/20210202.log  \\n extracting: /home/test_unarchive/20210203.log  \\n", "rc": 0}, "gid": 1000, "group": "awx", "handler": "ZipArchive", "mode": "0755", "owner": "awx", "size": 175, "src": "/home/test_unarchive/TestFolder2.zip", "state": "directory", "uid": 1000}

TASK [解凍先ディレクトリ名の取得] ***********************************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [解凍先ディレクトリの作成] ************************************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

TASK [圧縮ファイル[TestFolder2.zip]の解凍(フォルダ作成あり)] ************************************
skipping: [192.168.56.105] => {"changed": false, "skip_reason": "Conditional result was False"}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
TeraTerm lsコマンド
[root@SYUTAKUWEB01 test_unarchive]# ls -R1
.:
20210201.log
20210202.log
20210203.log
TestFolder2.zip

記事は以上になります。ご自由にお使いください。

コメント

タイトルとURLをコピーしました