Ansibleを使用してJunosデバイスとの間でファイルを転送する
juniper.device.file_copyモジュールを使用して、AnsibleコントロールノードとJunosデバイス間でファイルをコピーします。
ジュニパーネットワークスは、AnsibleコントロールノードとJunosデバイス間でファイルを転送するために使用できるAnsibleモジュールを提供しています。 表1は 、利用可能なモジュールの概要を示しています。Ansible には、ファイル操作を処理するための標準組み込みモジュールも用意されています。このトピックでは、 juniper.device.file_copy モジュールの使用方法について説明します。
|
コレクション |
モジュールセット |
モジュール名 |
|---|---|---|
|
|
||
junipernetworks.junos |
– |
juniper.device.file_copy モジュールの概要
juniper.device.file_copyモジュールを使用して、AnsibleコントロールノードとJunosデバイス間でファイルを転送できます。表2は、モジュール引数の概要を示しています。転送の方向を指定するには、action引数を含める必要があります。また、転送するファイルのローカルディレクトリとリモートディレクトリ、およびファイル名も指定する必要があります。オプションで、転送プロトコルと宛先ファイル名を含めることができます。
|
モジュール引数 |
説明 |
|---|---|
|
|
実行するアクション。リモートデバイスとリモートデバイスからファイルをコピーするかどうかを指定します。
|
|
|
(オプション)ファイルのMD5チェックサムを検証するかどうかを指定します。
|
|
|
コピーするファイルのファイル名。 |
|
|
ローカルAnsible制御ノード上のディレクトリ。 |
|
|
(オプション)ファイル転送に使用するプロトコル。
|
|
|
リモートデバイス上のディレクトリ。 |
|
|
(オプション)コピー先ファイルのファイル名。このパラメーターを省略すると、コピー先ファイルはソースファイルと同じファイル名を使用します。 |
デフォルトでは、 juniper.device.file_copy モジュールはSCPプロトコルを使用してファイルのチェックサムを検証し、コピーされたファイルの整合性を検証します。モジュールがファイルをコピー先ディレクトリにコピーし、コピーされたファイルのチェックサムが元のファイルのチェックサムと一致する場合、 file_copy モジュールは転送の成功を報告します。
場合によっては、転送は成功しても、チェックサムが一致しないためにタスクが失敗したとモジュールが報告することがあります。転送中にファイルが破損した場合、チェックサムの不一致が発生する可能性があります。また、頻繁に更新される大きなログファイルを転送する場合にも発生する可能性があります。この場合、転送中にファイルが更新されると、転送されたファイルが元のファイルとわずかに異なり、チェックサムの不一致が発生する可能性があります。このような場合、チェックサム検証をスキップするように checksum: false を設定できます。ただし、ファイル転送についてはチェックサム検証を維持することをお勧めします。
リモートデバイスからファイルを転送する
juniper.device.file_copyモジュールを使用して、JunosデバイスからAnsibleコントロールノードにファイルをコピーできます。例えば、デバイス上の設定ファイルやログファイルを定期的にアーカイブすることができます。リモートデバイスからファイルを転送するには、action: getを指定します。
以下のプレイブックでは、インベントリグループの各デバイスから Ansible 制御ノードの logs ディレクトリにメッセージログファイルを転送します。モジュール引数は、デフォルトである scpとして転送プロトコルを明示的に指定します。このモジュールは、コピーされた各ファイルが前のファイルを上書きしないように、宛先ファイルごとに一意のホスト固有のファイル名を使用します。
---
- name: Archive the messages log file
hosts: junos
connection: local
gather_facts: false
vars:
host_log_dir: "logs"
source_file: "messages"
tasks:
- name: Create the destination directory
ansible.builtin.file:
path: "{{ host_log_dir }}"
state: directory
run_once: true
- name: Copy the log file from remote device
juniper.device.file_copy:
action: get
file: "{{ source_file }}"
local_dir: "{{ host_log_dir }}"
protocol: scp
remote_dir: /var/log
transfer_filename: "{{ inventory_hostname }}-{{ source_file }}"
プレイブックを実行すると、まず ログ ディレクトリが作成されます。その後、プレイブックは、各デバイスから メッセージ ログファイルをコピー先ディレクトリにコピーし、各ファイルを一意のファイル名で保存します。コピータスクはすべてのホストで失敗したように見えますが、実際にはファイル転送は成功しています。この場合、Junosデバイスは転送が行われる間にログファイルを更新し続けます。その結果、元のファイルとコピーされたファイルが若干異なるため、ローカルファイルとリモートファイル間のチェックサム比較は失敗します。
user@ansible-cn:~$ ansible-playbook ansible-pb-archive-logs.yaml
PLAY [Archive the messages log file] ************************************************
TASK [Create the destination directory] *********************************************
ok: [r1]
TASK [Copy the log file from remote device] *****************************************
fatal: [r2]: FAILED! => {"changed": false, "msg": "Transfer failed (different MD5 between local and remote) 0b36d9e93cfd523b79eee5927ed42b68 | 3ea1421a5f68476c853180213df96686"}
fatal: [r3]: FAILED! => {"changed": false, "msg": "Transfer failed (different MD5 between local and remote) 7bac31566e5ec8da16d2a199dda628a6 | 40acb378a5e2b7aeacda3eb0337b5bec"}
fatal: [r1]: FAILED! => {"changed": false, "msg": "Transfer failed (different MD5 between local and remote) 7566d1efa73b50081dfee04aa4dbde57 | 2fce0d8a7272fe7e528786dade8cbe1f"}
PLAY RECAP **************************************************************************
r1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
r2 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
r3 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ログディレクトリを確認すると、メッセージログが各ホストに対してアーカイブされていることがわかります。
user@ansible-cn:~$ ls -l logs -rw-rw-r-- 1 user admin 459462 Jan 10 21:10 r1-messages -rw-rw-r-- 1 user admin 373848 Jan 10 21:10 r2-messages -rw-rw-r-- 1 user admin 374433 Jan 10 21:10 r3-messages
チェックサム検証が失敗することがわかっている場合は、オプションで検証をスキップする checksum: false を含めることができます。前のプレイブックを実行してチェックサム検証をスキップした場合、タスクはすべてのホストの "changed": true を報告します。
user@ansible-cn:~$ ansible-playbook ansible-pb-archive-logs.yaml PLAY [Archive the messages log file] ************************************************ TASK [Create the destination directory] ********************************************* ok: [r1] TASK [Copy the log file from remote device] ***************************************** changed: [r1] changed: [r2] changed: [r3] PLAY RECAP ************************************************************************** r1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 r2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 r3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
リモートデバイスへのファイルの転送
juniper.device.file_copyモジュールを使用して、AnsibleコントロールノードからJunosデバイスにファイルをコピーできます。リモートデバイスにファイルを転送するには、action: putを指定します。
次のプレイブックは、 bgp.slax スクリプトを Ansible 制御ノードから、指定されたインベントリグループの各ホストにコピーします。スクリプトは、プレイブックの スクリプト ディレクトリからJunosデバイスの /var/db/scripts/op ディレクトリにコピーされます。
---
- name: Copy script to the Junos device
hosts: junos
connection: local
gather_facts: false
tasks:
- name: Copy a local script to the Junos device
juniper.device.file_copy:
action: put
file: bgp.slax
local_dir: scripts
remote_dir: /var/db/scripts/op