Ansible - あるリモートノードから別のリモートノードにファイルをインポートする

Ansible - あるリモートノードから別のリモートノードにファイルをインポートする

Ansibleを使用してローカルワークステーションからNASサーバーにファイルをアップロードしたいと思います。どちらもAnsibleを介して管理されます。

これまでにこの機能を達成した唯一の方法は、NFSを介してNASファイル共有をローカルディレクトリにマウントし、コピー操作をAnsibleコントローラに委任することです。

  - name: Fetch files to NAS
    fetch:
      src: "{{ item.path }}"
      dest: "/NAS/Share/{{inventory_hostname}}/" #<local NFS mount
      flat: yes
      validate_checksum: yes
    with_items: "{{ found_files.files }}"

ただし、このソリューションは遅く、エラーが発生しやすいです。また、Ansible Towerを試してみたいのですが、このソリューションはまったく機能しないようです。

Ansibleでこれを自動化できますか?私が考えることができる唯一の解決策は、NASをワークステーションにマウントしてローカルにコピーすることです。私はこの方法を避けたいと思います。

どんなアドバイスも本当にありがとうございます。

ありがとうございます!

編集:以下の素晴らしいコメント作成者に感謝します!私は提案されているようにsynchronizeLinuxワークステーションでモジュールを使うことができました。

残念ながら、一部のワークステーションはWindowsを実行しているため、このモジュールは使用できません。現在私が取ることができる唯一の実行可能なソリューションはを使用することです。pscpAnsibleのみを維持するために使用を避けたいです。

WindowsワークステーションからNASにファイルを抽出するために使用できる他の方法はありますか?

ありがとうございます!

答え1

より多くのオプションがあります。例えば同期またはSCP

同期

モジュールの使用同期可能であれば:

  • インストールする同期NASとワークステーションから。バラよりノート
  • NASからワークステーションとしてパスワードのないSSHを構成します。

たとえば、テスト用のプロジェクトを作成します。

shell> tree .
.
├── ansible.cfg
├── group_vars
│   └── all
│       └── nas.yml
├── hosts
└── pb.yml

2 directories, 4 files
shell> cat ansible.cfg 
[defaults]
gathering = explicit
collections_path = $HOME/.local/lib/python3.9/site-packages/
inventory = $PWD/hosts
roles_path = $PWD/roles
remote_tmp = ~/.ansible/tmp
retry_files_enabled = false
stdout_callback = yaml

変数の宣言とカスタマイズ

shell> cat group_vars/all/nas.yml 
---

# Customize below variables - - - - - - - - - - - - - - - - - - - - - -

# Resolvable host or IP
nas_host: "{{ hostvars[nas].ansible_host }}"

# Workstation user who can read the files
wrks_admin: admin

# NAS user who runs the upload script
nas_admin: admin

# Directory at controller keeps the public keys of nas_admin
nas_dir_pub_keys: /tmp/nas_pub_keys

# Directory at NAS to upload the files to
nas_dir_share: /tmp/ansible/share

# Script at NAS run by nas_admin to upload the files
nas_upload_script: /tmp/nas_upload_script.bash

# List of files to upload from the workstations to NAS
nas_upload:
  - /etc/passwd


# Do not change this - - - - - - - - - - - - - - - - - - - - - - - - -

# The variable wrks keeps the comma-separated list of
# worstations. Create a list of the workstations
nas_wrks: "{{ wrks.split(',') }}"

# Public key of nas_admin stored at controller
nas_key: "{{ nas_dir_pub_keys }}/{{ nas }}/home/{{ nas_admin }}/.ssh/id_rsa.pub"

NASサーバーとワークステーションのインベントリの作成

shell> cat hosts 
[nas]
nas_4 ansible_host=10.1.0.74

[nas:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_python_interpreter=/bin/python3.6

[wrks]
wrks_1 ansible_host=10.1.0.61
wrks_2 ansible_host=10.1.0.17
wrks_3 ansible_host=10.1.0.63

[wrks:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_python_interpreter=/usr/local/bin/python3.8
ansible_perl_interpreter=/usr/local/bin/perl

スクリプトの作成

shell> cat pb.yml 
---

# Mandatory variables:
#
#   nas ... NAS server
#   wrks .. Workstations; comma-separated list

- name: NAS ready
  hosts: "{{ nas }}"
  tasks:
    - fetch:
        src: "/home/{{ nas_admin }}/.ssh/id_rsa.pub"
        dest: "{{ nas_dir_pub_keys }}"
    - file:
        state: directory
        path: "{{ nas_dir_share }}/{{ item }}"
        owner: "{{ nas_admin }}"
      loop: "{{ nas_wrks }}"
    - copy:
        dest: "{{ nas_upload_script }}"
        content: |
          {{ '#' }}!/usr/bin/bash
          {% for host in nas_wrks %}
          {% set wrks_host = hostvars[host].ansible_host %}
          {% for file in nas_upload %}
          scp {{ wrks_admin }}@{{ wrks_host }}:{{ file }} {{ nas_dir_share }}/{{ host }}
          {% endfor %}
          {% endfor %}
        owner: "{{ nas_admin }}"
        mode: "u+x"

- name: Workstations ready
  hosts: "{{ wrks }}"
  tasks:
    - authorized_key:
        user: "{{ wrks_admin }}"
        key: "{{ lookup('file', nas_key) }}"

- name: Workstations upload files to NAS
  hosts: "{{ wrks }}"
  tasks:
    - synchronize:
        mode: pull
        src: "{{ item }}"
        dest: "{{ nas_dir_share }}/{{ inventory_hostname }}"
        checksum: true
      delegate_to: "{{ nas }}"
      loop: "{{ nas_upload }}"
      register: out
      become_user: "{{ nas_admin }}"
    - debug:
        var: out
      when: debug|d(false)|bool

追加変数を使用してプレイブックを実行する

shell> ansible-playbook pb.yml -e nas=nas_4 -e wrks=wrks_2,wrks_3

初演でNAS ready:

  • 公開鍵NASマネージャー存在する那須コントローラーに保存
shell> tree -a /tmp/nas_pub_keys/
/tmp/nas_pub_keys/
└── nas_4
    └── home
        └── admin
            └── .ssh
                └── id_rsa.pub

4 directories, 1 file
  • 目次nas_dir_shareすべてのワークステーションに適していますウォーカー組み込み那須
nas_4> ssh [email protected] tree /tmp/ansible/share
tmp/ansible/share/
├── wrks_2
└── wrks_3
2 directories, 0 files
  • または、NASのコマンドラインからファイルをアップロードするスクリプトを作成します。

セカンドドラマでWorkstations ready:

  • 公開鍵の追加NASマネージャー存在する那須到着認証キー~のwrks_adminすべてのワークステーションでウォーカー

第三ドラマでWorkstations upload files to NAS:

  • リストからファイルをインポートするnas_uploadワークステーションから那須
  • (オプション)登録結果を表示します。

スクリプトの実行

shell> ansible-playbook pb.yml -e nas=nas_4 -e wrks=wrks_2,wrks_3

PLAY [NAS ready] *****************************************************************************

TASK [fetch] *********************************************************************************
changed: [nas_4]

TASK [file] **********************************************************************************
changed: [nas_4] => (item=wrks_2)
changed: [nas_4] => (item=wrks_3)

TASK [copy] **********************************************************************************
ok: [nas_4]

PLAY [Workstations ready] ********************************************************************

TASK [authorized_key] ************************************************************************
ok: [wrks_3]
ok: [wrks_2]

PLAY [Workstations upload files to NAS] ******************************************************

TASK [synchronize] ***************************************************************************
changed: [wrks_2 -> nas_4(10.1.0.74)] => (item=/etc/passwd)
changed: [wrks_3 -> nas_4(10.1.0.74)] => (item=/etc/passwd)

TASK [debug] *********************************************************************************
skipping: [wrks_2]
skipping: [wrks_3]

PLAY RECAP ***********************************************************************************
nas_4: ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
wrks_2: ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
wrks_3: ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

リスト内のファイルnas_uploadワークステーションからコピーされました。ウォーカー到着nas_dir_share存在する那須

nas_4> tree /tmp/ansible/share/
/tmp/ansible/share/
├── wrks_2
│   └── passwd
└── wrks_3
    └── passwd

2 directories, 2 files

SCP

スクリプトの使用nas_upload_scriptもしあなたなら:

  • NASとワークステーションにrsyncをインストールすることはできません。しかし、あなたは
  • NASからワークステーションへのパスワードなしのSSHを構成できます。
admin@nas_4> cat /tmp/nas_upload_script.bash 
#!/usr/bin/bash
scp [email protected]:/etc/passwd /tmp/ansible/share/wrks_2
scp [email protected]:/etc/passwd /tmp/ansible/share/wrks_3

3番目の再生をスキップしてスクリプトを実行する那須コマンドラインから

admin@nas_4> /tmp/nas_upload_script.bash 
passwd                                  100% 2958   595.8KB/s   00:00    
passwd                                  100% 1708   375.5KB/s   00:00

メモ:

  • NASにAnsibleをインストールできる場合は、簡単なオプションはNASでゲームを実行することです。

  • 次のスクリプトを生成することもできます。同期NASコマンドラインのファイル

  • 価値NASマネージャーそしてwrks_adminと異なる場合がありますansible_user

  • 仕事コピー最初のゲームではオプションです。スクリプトが不要な場合は削除できます。

答え2

rsync 操作に Ansible 同期モジュールを使用できます。更新されていないファイルがあると、コピー速度が速くなり、転送されないことがあります。
https://docs.ansible.com/ansible/latest/collections/ansible/posix/synchronize_module.html

関連情報