【Ansible Tower/AWX】copyモジュールの使い方


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

Ansible

ホーム > Ansible Tower・AWX リファレンス

AnsibleのcopyモジュールをAWXと組み合わせて使用する方法を解説します。
copyモジュールでは、ファイルやディレクトリをコピーすることが可能です。
コマンドラインのAnsible、Towerでも同様に使用可能です。

copyモジュールについて

copyモジュールは、Linuxでの[cp]コマンドと似たような機能になります。

copyモジュールでよく使用するパラメータになります。
これらを組み合わせることで、様々な処理を行うことが可能です。

パラメータ選択肢/デフォルト機能
backupno←
・yes
[yes]の場合、上書きされるファイルのバックアップを取得する。
dest必須コピー先を指定する。
directory_modeディレクトリのパーミッションを指定する。
指定されていない場合はシステムのデフォルト値が使用される。
このパラメータは、新しく作成されるディレクトリにのみ適用され、既存ディレクトリには適用されない。
force・no
yes←
[no]の場合、内容が異なる場合のみ、処理が実行される。
[yes]の場合、常に処理が実行される。
groupグループを指定する。
modeファイルのパーミッションを指定する。
owner所有者を指定する。
remote_srcno←
・yes
[no]の場合、コントロールノード→ターゲットノード間で処理を行う。
[yes]の場合、ターゲットノード→ターゲットノード間で処理を行う。
srcコピー元を指定する。

その他のパラメーターは公式をご覧ください。

AWXの各種定義

Ansible AWX での各種定義について記載しています。

テンプレート

今回実行するテンプレートの設定になります。

  • 名前:Module Copy Template
  • 説明:copyモジュール
  • ジョブタイプ:実行
  • インベントリー:Test Server Inventory
  • プロジェクト:秋拓プロジェクト
  • PLAYBOOK:copy.yml
  • 認証情報:awx
  • 詳細:1(Verbose)

認証情報

今回使用する認証情報の設定になります。

  • 名前:awx
  • 説明:awxユーザ
  • 認証情報タイプ:マシン
  • ユーザー名:awx
  • パスワード:「ユーザー名」に設定したユーザーに対応したパスワード

インベントリー

今回使用するインベントリーの設定になります。

  • 名前:Test Server Inventory
  • 説明:試験環境向けインベントリ

ファイルのコピー(コントロールノード→ターゲットノード)

下記の条件でコピーを行います。
・所有者:awx
・グループ:awx
・パーミッション:777

Ansibleのcopyモジュールは、通常(パラメータを指定しない)の場合、コントロールノードからターゲットノードへのコピーを行います。
Linuxにおける[cp]コマンドよりは、[rcp],[scp]に近いイメージです。

プレイブック

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

  - name: ファイルのコピー
    copy:
      src: /home/workspace/test_file_01.txt
      dest: /home/release/
      owner: awx
      group: awx
      mode: 0777

[mode]パラメーターでパーミッションを指定する際、「644」や「777」と3桁で指定すると予期しない結果になるので注意が必要です。
先頭に「0」を付けて、「0644」、「0777」のように指定する必要があります。
また、引用符で囲み「’644’」、「’777’」のように記述しても問題ありません。

実行結果

Using /etc/ansible/ansible.cfg as config file
SSH password: 

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

TASK [ファイルのコピー] ****************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/home/release/test_file_01.txt", "gid": 1000, "group": "awx", "mode": "0777", "owner": "awx", "path": "/home/release/test_file_01.txt", "size": 0, "state": "file", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

タスク「ファイルのコピー」の詳細情報になります。

{
    "diff": {
        "before": {
            "path": "/home/release/test_file_01.txt",
            "mode": "0664"
        },
        "after": {
            "path": "/home/release/test_file_01.txt",
            "mode": "0777"
        }
    },
    "path": "/home/release/test_file_01.txt",
    "changed": true,
    "uid": 1000,
    "gid": 1000,
    "owner": "awx",
    "group": "awx",
    "mode": "0777",
    "state": "file",
    "size": 0,
    "invocation": {
        "module_args": {
            "owner": "awx",
            "group": "awx",
            "mode": 511,
            "dest": "/home/release/",
            "_original_basename": "test_file_01.txt",
            "recurse": false,
            "state": "file",
            "path": "/home/release/test_file_01.txt",
            "force": false,
            "follow": true,
            "modification_time_format": "%Y%m%d%H%M.%S",
            "access_time_format": "%Y%m%d%H%M.%S",
            "_diff_peek": null,
            "src": null,
            "modification_time": null,
            "access_time": null,
            "seuser": null,
            "serole": null,
            "selevel": null,
            "setype": null,
            "attributes": null,
            "content": null,
            "backup": null,
            "remote_src": null,
            "regexp": null,
            "delimiter": null,
            "directory_mode": null,
            "unsafe_writes": null
        }
    },
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/home/release/test_file_01.txt",
    "_ansible_no_log": false
}

ディレクトリのコピー(コントロールノード→ターゲットノード)

下記の条件でコピーを行います。
・所有者:awx
・グループ:awx
・ディレクトリのパーミッション:777

コピー元のディレクトリが空の場合は、コピーが行われないので注意が必要です。
ジョブは「ok」となり、正常終了扱いですが、実際にはコピーされていません。

プレイブック

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

  - name: ディレクトリのコピー
    copy:
      src: /home/workspace/test_dir_01
      dest: /home/release
      owner: awx
      group: awx
      directory_mode: '777'

実行結果

Using /etc/ansible/ansible.cfg as config file
SSH password: 

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

TASK [ディレクトリのコピー] **************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/home/release/test_dir_01/test_file_01.txt", "gid": 1000, "group": "awx", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0664", "owner": "awx", "size": 0, "src": "/home/awx/.ansible/tmp/ansible-tmp-1645690967.5846834-425-229254520218955/source", "state": "file", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

タスク「ディレクトリのコピー」の詳細情報になります。

ディレクトリをコピーする際、ディレクトリ内のファイルも一緒にコピーされますが、パラメーターの指定が「directory_mode」のみの場合、ディレクトリのパーミッションのみ変更されます。
ファイルのパーミッションも同時に変更する場合は、下記のように「mode」も指定する必要があります。

- name: ディレクトリのコピー
  copy:
    src: /home/workspace/test_dir_01
    dest: /home/release
    owner: awx
    group: awx
    directory_mode: '777'
    mode: 0644
{
    "diff": [],
    "dest": "/home/release/test_dir_01/test_file_01.txt",
    "src": "/home/awx/.ansible/tmp/ansible-tmp-1645690967.5846834-425-229254520218955/source",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "changed": true,
    "uid": 1000,
    "gid": 1000,
    "owner": "awx",
    "group": "awx",
    "mode": "0664",
    "state": "file",
    "size": 0,
    "invocation": {
        "module_args": {
            "src": "/home/awx/.ansible/tmp/ansible-tmp-1645690967.5846834-425-229254520218955/source",
            "dest": "/home/release/test_dir_01/test_file_01.txt",
            "owner": "awx",
            "group": "awx",
            "directory_mode": "777",
            "_original_basename": "test_dir_01/test_file_01.txt",
            "follow": false,
            "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
            "backup": false,
            "force": true,
            "content": null,
            "validate": null,
            "remote_src": null,
            "local_follow": null,
            "mode": null,
            "seuser": null,
            "serole": null,
            "selevel": null,
            "setype": null,
            "attributes": null,
            "regexp": null,
            "delimiter": null,
            "unsafe_writes": null
        }
    },
    "_ansible_no_log": false
}

ファイルのコピー(ターゲットノードA→ターゲットノードA)

同一ターゲットノード内でのコピー、Linuxでの[cp]コマンド相当のコピー方法になります。
下記の条件でコピーを行います。
・所有者:awx
・グループ:awx
・ファイルのパーミッション:644

プレイブック

Linuxでのコマンドだと下記のコマンドを同時に実行するイメージになります。

cp -pv /home/release/test_dir_01/test_file_01.txt /home/release/test_dir_02
chown awx:awx /home/release/test_dir_02/test_file_01.txt
chmod 644 /home/release/test_dir_02/test_file_01.txt

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

  - name: ファイルのコピー
    copy:
      src: /home/release/test_dir_01/test_file_01.txt
      dest: /home/release/test_dir_02
      owner: awx
      group: awx
      mode: 0644
      remote_src: yes

実行結果

Using /etc/ansible/ansible.cfg as config file
SSH password: 

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

TASK [ファイルのコピー] ****************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/home/release/test_dir_02/test_file_01.txt", "gid": 1000, "group": "awx", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "awx", "size": 0, "src": "/home/release/test_dir_01/test_file_01.txt", "state": "file", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

タスク「ファイルのコピー」の詳細情報になります。

{
    "dest": "/home/release/test_dir_02/test_file_01.txt",
    "src": "/home/release/test_dir_01/test_file_01.txt",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "changed": true,
    "uid": 1000,
    "gid": 1000,
    "owner": "awx",
    "group": "awx",
    "mode": "0644",
    "state": "file",
    "size": 0,
    "invocation": {
        "module_args": {
            "src": "/home/release/test_dir_01/test_file_01.txt",
            "dest": "/home/release/test_dir_02/test_file_01.txt",
            "owner": "awx",
            "group": "awx",
            "mode": 420,
            "remote_src": true,
            "backup": false,
            "force": true,
            "follow": false,
            "_original_basename": null,
            "content": null,
            "validate": null,
            "directory_mode": null,
            "local_follow": null,
            "checksum": null,
            "seuser": null,
            "serole": null,
            "selevel": null,
            "setype": null,
            "attributes": null,
            "regexp": null,
            "delimiter": null,
            "unsafe_writes": null
        }
    },
    "_ansible_no_log": false
}

ディレクトリのコピー(ターゲットノードA→ターゲットノードA)

同一ターゲットノード内でのコピー、Linuxでの[cp -rpv]コマンド相当のコピー方法になります。
下記の条件でコピーを行います。
・所有者:awx
・グループ:awx

プレイブック

ターゲットノード間のコピーでは、以下のパラメーターが正常に動作しませんでした。
サンプルのプレイブック上は、コメントアウトにしています。

mode(ファイルのパーミッションの変更)

ファイルとディレクトリのパーミッションが変更されてしまいました。
パーミッションを[644]に設定すると、ディレクトリも[644]に設定されてアクセス出来ない状態になりました。

directory_mode(ディレクトリのパーミッションの変更)

パーミッションはコピー元から変更されませんでした。

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

  - name: ディレクトリのコピー
    copy:
      src: /home/release/test_dir_01
      dest: /home/release2
      owner: awx
      group: awx
#      directory_mode: 0775
#      mode: 0644
      remote_src: yes

実行結果

Using /etc/ansible/ansible.cfg as config file
SSH password: 

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

TASK [ディレクトリのコピー] **************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": null, "dest": "/home/release2/test_dir_01", "gid": 1000, "group": "awx", "md5sum": null, "mode": "0777", "owner": "awx", "size": 30, "src": "/home/release/test_dir_01", "state": "directory", "uid": 1000}

PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

タスク「ディレクトリのコピー」の詳細情報になります。

{
    "dest": "/home/release2/test_dir_01",
    "src": "/home/release/test_dir_01",
    "md5sum": null,
    "checksum": null,
    "changed": true,
    "uid": 1000,
    "gid": 1000,
    "owner": "awx",
    "group": "awx",
    "mode": "0777",
    "state": "directory",
    "size": 30,
    "invocation": {
        "module_args": {
            "src": "/home/release/test_dir_01",
            "dest": "/home/release2/test_dir_01",
            "owner": "awx",
            "group": "awx",
            "remote_src": true,
            "backup": false,
            "force": true,
            "follow": false,
            "_original_basename": null,
            "content": null,
            "validate": null,
            "directory_mode": null,
            "local_follow": null,
            "checksum": null,
            "mode": null,
            "seuser": null,
            "serole": null,
            "selevel": null,
            "setype": null,
            "attributes": null,
            "regexp": null,
            "delimiter": null,
            "unsafe_writes": null
        }
    },
    "_ansible_no_log": false
}

記事は以上になります。
copyモジュールを使用した各ノード間での、ファイル・ディレクトリのコピー方法を解説しました。
使用頻度も高いモジュールだと思いますので、しっかり覚えておきましょう。

コメント

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