Ansibleを使用してJunosデバイスとの間でファイルを転送
ジュニパーネットワークスのAnsibleモジュールを使用して、Ansible制御ノードとJunosデバイス間でファイルをコピーします。
file_copy モジュールの概要
juniper.device.file_copy Ansibleモジュールを使用して、Ansible制御ノードとJunosデバイス間でファイルを転送できます。表 1 は、モジュール引数の概要を示しています。転送の方向を指定するには、action 引数を含める必要があります。また、ローカルディレクトリとリモートディレクトリ、および転送するファイルのファイル名を指定する必要があります。
| モジュール引数 |
形容 |
デフォルト |
|---|---|---|
|
|
リモートデバイスにファイルをコピーするか、リモートデバイスからファイルをコピーするかを指定します。サポートされている値:
|
— |
|
|
コピーするファイルのファイル名。 |
— |
|
|
ローカルAnsible制御ノード上のディレクトリ。 |
— |
|
|
リモート デバイス上のディレクトリ。 |
— |
モジュールがファイルをコピー先ディレクトリにコピーし、コピーされたファイルのチェックサムが元のファイルのチェックサムと一致する場合、 file_copy モジュールは転送の成功を報告します。場合によっては、転送は成功しますが、チェックサムが一致しないためにタスクが失敗したとモジュールが報告します。これは、転送中にファイルが破損した場合に発生する可能性があります。また、頻繁に更新される大きなログファイルを転送する場合にも発生する可能性があります。この場合、転送中にファイルが更新されると、転送されたファイルが元のファイルとわずかに異なり、チェックサムの不一致が発生する可能性があります。
リモートデバイスからのファイル転送
juniper.device.file_copyモジュールを使用して、JunosデバイスからAnsible制御ノードにファイルをコピーできます。例えば、デバイス上の構成ファイルやログファイルを定期的にアーカイブすることができます。リモートデバイスからファイルを転送するには、action: getを指定します。
以下のプレイブックは、 メッセージ ログ ファイルをインベントリ グループ内の各デバイスから Ansible 制御ノード上のホスト固有のディレクトリに転送します。
---
- name: Archive the messages log file
hosts: junos
connection: local
gather_facts: false
vars:
host_log_dir: "logs/{{ inventory_hostname }}"
tasks:
- name: Create the log directory for the host
ansible.builtin.file:
path: "{{ host_log_dir }}"
state: directory
- name: Copy the log file from remote device
juniper.device.file_copy:
action: get
file: messages
local_dir: "{{ host_log_dir }}"
remote_dir: /var/log
プレイブックを実行すると、インベントリーグループ内の各ホストの logs/hostname ディレクトリが作成されます。次に、Playbook は 、各 リモートホストからそのホストのそれぞれの宛先ディレクトリにメッセージログファイルをコピーします。コピー・タスクはすべてのホストで失敗したように見えますが、実際にはファイル転送は成功しています。Junos デバイスは、 メッセージ ログ ファイルを絶えず更新します。そのため、この場合、Junos デバイスは転送が発生しながらログ ファイルを更新しています。その結果、元のファイルとコピーされたファイルがわずかに異なるため、ローカルファイルとリモートファイルのチェックサム比較は失敗します。
user@ansible-cn:~$ ansible-playbook ansible-pb-archive-logs.yaml
PLAY [Archive the messages log file] **********************************************
TASK [Create the log directory for the host] **************************************
ok: [r3]
ok: [r2]
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=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
r3 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ログ・ディレクトリーを確認すると、メッセージ・ログがホストごとにアーカイブされます。
user@ansible-cn:~$ ls -l logs/* logs/r1: total 452 -rw-rw-r-- 1 user admin 459462 Sep 10 21:10 messages logs/r2: total 368 -rw-rw-r-- 1 user admin 373848 Sep 10 21:10 messages logs/r3: total 368 -rw-rw-r-- 1 user admin 374433 Sep 10 21:10 messages
リモートデバイスへのファイル転送
juniper.device.file_copyモジュールを使用して、Ansible制御ノードからJunosデバイスにファイルをコピーできます。ファイルをリモートデバイスに転送するには、action: putを指定します。
次のプレイブックは、 bgp.slax スクリプトを Ansible 制御ノードから指定されたインベントリグループの各ホストにコピーします。スクリプトは、プレイブック ディレクトリ内の scripts ディレクトリから 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