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をワークステーションにマウントしてローカルにコピーすることです。私はこの方法を避けたいと思います。
どんなアドバイスも本当にありがとうございます。
ありがとうございます!
編集:以下の素晴らしいコメント作成者に感謝します!私は提案されているようにsynchronize
Linuxワークステーションでモジュールを使うことができました。
残念ながら、一部のワークステーションはWindowsを実行しているため、このモジュールは使用できません。現在私が取ることができる唯一の実行可能なソリューションはを使用することです。pscp
Ansibleのみを維持するために使用を避けたいです。
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