জবাবদিহি করে কীভাবে দুটি নোডের মধ্যে ফাইলগুলি অনুলিপি করবেন


101

আমাকে ফাইল ফর্ম মেশিন এ টু মেশিন বি অনুলিপি করতে হবে যেখানে আমার কন্ট্রোল মেশিনটি যেখানে আমি আমার সমস্ত জবাবদিহি কাজগুলি চালনা করি তা হ'ল মেশিন সি (লোকাল মেশিন)

আমি নিম্নলিখিত চেষ্টা করেছি:

জবাবদিহি শেল মডিউল মধ্যে scp কমান্ড ব্যবহার করুন

hosts: machine2
user: user2
tasks:
  - name: Copy file from machine1 to machine2 
    shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1

এই পদ্ধতির সবেমাত্র চলে এবং শেষ হয় না।

সংগ্রহ এবং অনুলিপি মডিউল ব্যবহার করুন

hosts: machine1
user: user1
tasks:
  - name: copy file from machine1 to local
    fetch: src=/path-of-file/file1 dest=/path-of-file/file1

hosts: machine2
user: user2
tasks:
  - name: copy file from local to machine2
    copy: src=/path-of-file/file1 dest=/path-of-file/file1

এই পদ্ধতিটি আমাকে নীচে ত্রুটি ছুড়ে দিয়েছে:

error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'

কোন পরামর্শ সহায়ক হবে।


1.এটি নেটওয়ার্ক অ্যাক্সেসগুলি সংরক্ষণ করার জন্য একটি সুবিধাজনক বৈশিষ্ট্য, যখন কন্ট্রোল মেশিনটি আরও দূরে হতে পারে; ২.একটি এখন github.com/ansible/ansible/pull/16756 প্রতি ঠিক করা উচিত জ্যাকট্যানার 0d94d39 কে কমপ্লিট করে জবাবদিহিতে পরিণত করুন: 23 শে সেপ্টেম্বর, 2016
অ্যাভেল দ্য অ্যাজিল

উত্তর:


102

রিমোট-টু-রিমোট ফাইলগুলি অনুলিপি করতে আপনি ' ' কীওয়ার্ডের সাথে সিঙ্ক্রোনাইজ মডিউলটি ব্যবহার করতে পারেন delegate_to: source-server:

- hosts: serverB
  tasks:    
   - name: Copy Remote-To-Remote (from serverA to serverB)
     synchronize: src=/copy/from_serverA dest=/copy/to_serverB
     delegate_to: serverA

এই প্লেবুকটি আপনার মেশিনসি থেকে চালানো যেতে পারে।


ভাল উত্তর! দুর্ভাগ্যক্রমে আমি এটি বহু ভিএম সহ কোনও ভ্রান্ত পরিবেশে কাজ করিনি। মনে হচ্ছে ভ্যাগ্র্যান্ট সেখানে বিশেষ কিছু করে।
Therealmarv

এটি আরএসআইএনসি ব্যবহার করে, আপনি কি এটি ভিএম-তে ইনস্টল করেছেন?
ant31

4
ভ্যাগ্র্যান্ট 1.7.x দিয়ে শুরু করে এটি মেশিনের উপর নির্ভর করে বিভিন্ন প্রাইভেট কী ব্যবহার করে। সমস্যাটি দেখুন github.com/mitchellh/vagrant/issues/4967 ভ্যাগ্রান্টফাইলে নিম্নলিখিত মেশিনটি প্রবেশ করান ভ্যাগ্রান্টকে config.ssh.insert_key = falseসমস্ত মেশিনে অ্যাক্সেসের জন্য এক সুরক্ষিত_কি ব্যবহার করতে বাধ্য করতে। তবে এখন আমি ত্রুটি বার্তাটিও পাই না (এটি চিরকাল অপেক্ষা করে)। এছাড়াও বাগ github.com/ansible/ansible/issues/7250 বলছে রিমোট থেকে রিমোটে অনুলিপি করা সম্ভব নয়।
Therealmarv

9
এটি আসলে সার্ভারবি থেকে সার্ভারএতে ফাইলগুলি অনুলিপি করে। আপনি যদি এগুলি সার্ভারএ থেকে সার্ভারবিতে অনুলিপি করতে চান তবে ব্যবহার করুন mode=push(বা delegate_to: serverB, তবে উভয়ই নয়)।
মারিউস গেডমিনাস

4
@ মারিয়াসজেডমিনাস আপনি সঠিক, mode=pushব্যবহার করা উচিত, তবে এই পরিস্থিতিতে delegate_to: serverBব্যবহার করা যাবে না, কারণ serverBএটি উত্স এবং গন্তব্য তৈরি করে।
স্ট্রাহিনজা কাস্টুডিক

96

হিসাবে ant31 ইতিমধ্যে নির্দেশিত আপনি এটি synchronizeমডিউল ব্যবহার করতে পারেন । ডিফল্টরূপে, মডিউলটি নিয়ন্ত্রণ মেশিন এবং বর্তমান রিমোট হোস্ট ( inventory_host) এর মধ্যে ফাইল স্থানান্তর করে , তবে এটি টাস্কের delegate_toপ্যারামিটার ব্যবহার করে পরিবর্তন করা যেতে পারে (এটি গুরুত্বপূর্ণ যে এটি মডিউলটির নয়, টাস্কের একটি প্যারামিটার )।

আপনি পারেন টাস্ক স্থাপন করতে পারেন ServerAবা ServerB, কিন্তু আপনি স্থানান্তরের অভিমুখ তদনুসারে (ব্যবহার সমন্বয় আছে modeযে পরামিতি synchronize)।

টাস্কটি রাখা হচ্ছে ServerB

- hosts: ServerB
  tasks:
    - name: Transfer file from ServerA to ServerB
      synchronize:
        src: /path/on/server_a
        dest: /path/on/server_b
      delegate_to: ServerA

এটি ডিফল্ট ব্যবহার করে mode: push, তাই ফাইলটি প্রতিনিধি ( ServerA) থেকে বর্তমান দূরবর্তী ( ServerB) এ স্থানান্তরিত হয় ।

এটি সম্ভবত আশ্চর্যজনক মনে হতে পারে, যেহেতু কার্যটি ServerB(মাধ্যমে hosts: ServerB) করা হয়েছে। তবে, আমাদের মনে রাখতে হবে যে কার্যটি কার্যত ডেলিস্টেড হোস্টের উপর কার্যকর করা হয় , যা এই ক্ষেত্রে ServerA। (থেকে ঠেলাঠেলি তাই ServerAকরতে ServerB) প্রকৃতপক্ষে সঠিক দিক আছে। এছাড়াও মনে রাখবেন যে আমরা সহজেই কোনও উপস্থাপন না করা বেছে নিতে পারি না, কারণ এর অর্থ হ'ল কন্ট্রোল মেশিন এবং এর মধ্যে স্থানান্তর ঘটে ServerB

টাস্কটি রাখা হচ্ছে ServerA

- hosts: ServerA
  tasks:
    - name: Transfer file from ServerA to ServerB
      synchronize:
        src: /path/on/server_a
        dest: /path/on/server_b
        mode: pull
      delegate_to: ServerB

এটি mode: pullস্থানান্তর দিকটি উল্টাতে ব্যবহার করে। আবার, মনে রাখবেন যে কার্যটি কার্যত সম্পাদিত হয়েছে ServerB, সুতরাং টানাই সঠিক পছন্দ।


8
এটি এত উত্তম উত্তর এটি উত্তরযোগ্য ডকুমেন্টেশনের অংশ হওয়া উচিত । সেখানকার উদাহরণগুলির মধ্যে কোনওটিই এটিকে পরিষ্কার ফ্যাশনে ব্যাখ্যা করে না। ধন্যবাদ!
এসএসসি

4
আমি এটি বহু উপায়ে চেষ্টা করেছি, তবে আমাকে ব্যর্থ করে Warning: Identity file /Users/myuser/.ssh/id_servers not accessible
orotemo

@ অরোটেমো: আরও তথ্য ব্যতীত আমি কেবল অনুমান করতে পারি তবে এটি আপনার এসএসএইচ সেটআপে কোনও সমস্যার মতো দেখায়। আপনি এসএসএইচ কনফিগার করেছেন কিনা বা ত্রুটি বার্তায় প্রদত্ত পরিচয় ফাইলটি ব্যবহার করার জন্য এবং এই ফাইলটি বিদ্যমান রয়েছে কিনা এবং সঠিক অনুমতি রয়েছে কিনা তা পরীক্ষা করে দেখুন।
ফ্লোরিয়ান ব্রুকার

4
@ উইলিয়ামট্যুরেল স্থানান্তর দিকটি আরও বিস্তারিতভাবে ব্যাখ্যা করতে আমি আমার উত্তর আপডেট করেছি। মডিউলটি আসলে কিছুটা বিভ্রান্তিকর।
ফ্লোরিয়ান ব্রুকার

4
ধন্যবাদ অন্য কারও জন্য @ অরোটেমো'র সমস্যা রয়েছে, সম্ভাব্য সমাধানটি হ'ল সার্ভার এ এবং বি এর মধ্যে আপনার কাছে কোনও পাবলিক কী অ্যাক্সেস নেই, বা যেমন আমি পেয়েছি, আপনি এটি কেবলমাত্র এক দিকে কাজ করার জন্য সেট আপ করেছেন - ভুলটি। সার্ভার এ আপনার .ssh ডিরেক্টরিতে কোনও কী-পেয়ারের অভাবে, আপনার স্থানীয় মেশিনের হোম ডিরেক্টরি ব্যবহার করার জন্য জবাবদিহি করার চেষ্টা করে (এটি যদি নেই, ম্যাক, এবং কোনও আলাদা অ্যাকাউন্টের নাম থাকতে পারে তবে এটি উপস্থিত থাকবে না)
উইলিয়াম তারেল 18

3

আপনার যদি উত্তরীয়ের মাধ্যমে দুটি দূরবর্তী নোডের মধ্যে ফাইলগুলি সিঙ্ক করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন:

- name: synchronize between nodes
  environment:
    RSYNC_PASSWORD: "{{ input_user_password_if_needed }}"
  synchronize:
    src: rsync://user@remote_server:/module/
    dest: /destination/directory/
    // if needed
    rsync_opts:
       - "--include=what_needed"
       - "--exclude=**/**"
    mode: pull
    delegate_to: "{{ inventory_hostname }}"

যখন remote_serverআপনাকে ডিমন মোড দিয়ে আরএসসিঙ্ক শুরু করতে হবে। সাধারণ উদাহরণ:

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
port = port

[module]
path = /path/to/needed/directory/
uid = nobody
gid = nobody
read only = yes
list = yes
auth users = user
secrets file = /path/to/secret/file

2

আমি স্থানীয়_অ্যাকশনটি মেশিনএ থেকে মেশিনসি-তে মেশিনে ফাইল ফাইল করতে এবং তারপরে ফাইলটি মেশিনবিতে অনুলিপি করে সমাধান করতে সক্ষম হয়েছি।


1

এক সার্ভার থেকে অন্য সার্ভারে ফাইল স্থানান্তর করার জন্য অনুলিপি করা মডিউলটির একটি সহজ উপায়

এখানে প্লেবুক

---
- hosts: machine1 {from here file will be transferred to another remote machine}
  tasks:
  - name: transfer data from machine1 to machine2

    copy:
     src=/path/of/machine1

     dest=/path/of/machine2

    delegate_to: machine2 {file/data receiver machine}

এটি আজ একটি অধিবেশন চলাকালীন উত্থাপিত হয়েছে, তবে আমরা দু'জনই উত্তরযোগ্য ২.6.৪ ব্যবহার করে এটির প্রতিরূপ করতে পারিনি। প্রথমে মেশিন 1-এ একটি ফাইল তৈরি করে এই ডিরেক্টরিটি প্লেবুকের মধ্যে রাখার পরে ডিরেক্টরিটি তালিকাভুক্তকরণের পরে "উত্তরীয় নিয়ামকটিতে" / tmp / উত্স-49731914 খুঁজে পাওয়া বা অ্যাক্সেস করতে পারা যায় না "দিয়ে ব্যর্থ হয়েছিল। হোস্ট মেশিনে একটি খালি ফাইল তৈরি করা এটি সমাধান করেছে, তবে একটি অনুলিপি হোস্ট> মেশিন 2 করেছেন। সম্ভবত কিছু সংস্করণে বগী আচরণ ছিল?
স্টিফান বি

0

যদি আপনি আরএসএনসি করতে চান এবং কাস্টম ব্যবহারকারী এবং কাস্টম এসএস কী ব্যবহার করতে চান তবে আপনাকে এই কীটি আরএসসিএন বিকল্পে লিখতে হবে need

---
 - name: rsync
   hosts: serverA,serverB,serverC,serverD,serverE,serverF
   gather_facts: no
   vars:
     ansible_user: oracle
     ansible_ssh_private_key_file: ./mykey
     src_file: "/path/to/file.txt"
   tasks:
     - name: Copy Remote-To-Remote from serverA to server{B..F}
       synchronize:
           src:  "{{ src_file }}"
           dest: "{{ src_file }}"
           rsync_opts:
              - "-e ssh -i /remote/path/to/mykey"
       delegate_to: serverA

0

আপনি এটির deletgateসাথেও ব্যবহার করতে পারেন scp:

- name: Copy file to another server
  become: true
  shell: "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null admin@{{ inventory_hostname }}:/tmp/file.yml /tmp/file.yml"
  delegate_to: other.example.com

কারণ delegateকমান্ড অন্য সার্ভার চালানো এবং এটি scp'নিজেই ফাইল s।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.