it-swarm.com.de

Ansible: Kopieren Sie einen Verzeichnisinhalt in ein anderes Verzeichnis

Ich versuche, den Inhalt des Verzeichnisses dist in das Verzeichnis nginx zu kopieren.

Ich schreibe das nächste:

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes

Aber wenn ich das Playbook ausführt, wird ein Fehler ausgegeben:

TASK [NGINX : copy html file] **************************************************
fatal: [172.16.8.200]: FAILED! => {"changed": false, "failed": true, "msg": "attempted to take checksum of directory:/home/vagrant/dist/"}

Sie haben einen Fehler beim Kopieren eines Verzeichnisses? Wie kann ich einen Verzeichnisinhalt kopieren, der ein anderes Verzeichnis und eine Datei enthält?

Irgendwelche Hilfe? Danke

24
Asier Gomez

Lösung gelöst: Um den Inhalt eines Verzeichnisses in ein anderes Verzeichnis zu kopieren, verwende ich das nächste:

- name: copy consul_ui files
  command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
  with_items:
   - "index.html"
   - "static/"

Beide Elemente werden in das andere Verzeichnis kopiert. In dem Beispiel ist eines der Elemente ein Verzeichnis und das andere nicht. Es funktioniert perfekt.

20
Asier Gomez

Sie können das Modul synchronize verwenden. Das Beispiel aus der Dokumentation:

# Synchronize two directories on one remote Host.
- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
  delegate_to: "{{ inventory_hostname }}"

Dies hat den zusätzlichen Vorteil, dass es für große/viele Dateien effizienter ist.

26
Aidan Feldman

Ansible Copy Modul kopiert standardmäßig Dateien/Verzeichnisse von der Steuerungsmaschine auf die entfernte Maschine. Wenn Sie Dateien/Verzeichnisse auf einem entfernten Computer kopieren möchten und Ansible 2.0 verwenden, setzen Sie remote_src auf yes.

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
12
helloV

Die einfachste Lösung, die ich gefunden habe, um die contents eines Ordners zu kopieren, ohne den Ordner selbst zu kopieren, ist Folgendes:

- name: Move directory contents
  command: cp -r /<source_path>/. /<dest_path>/

Dies löst @ surfer190 s Folgefrage:

Hmmm was ist, wenn du den gesamten Inhalt kopieren möchtest? Mir ist aufgefallen, dass * nicht funktioniert - surfer190 23. Juli 16 um 07:29

* ist eine Shell-Glob, da es von Ihrer Shell abhängt, alle Dateien im Ordner vor aufzurufen, die cp ausführen, während .cp direkt anweist, den Inhalt des Verzeichnisses abzurufen (siehe https: // askubuntu. de/questions/86822/how-can-i-copy-the-content-of-a-ordner in einen anderen ordner-in-a-different-directo )

5
fractalic

Ansible remote_src unterstützt kein rekursives Kopieren. Siehe remote_src-Beschreibung in Ansible-Kopierdokumenten

Um den Inhalt eines Ordners rekursiv zu kopieren und sicherzustellen, dass die Task idempotent bleibt, mache ich das normalerweise so:

- name: get file names to copy
  command: "find /home/vagrant/dist -type f"
  register: files_to_copy

- name: copy files
  copy:
    src: "{{ item }}" 
    dest: "/usr/share/nginx/html"
    owner: nginx
    group: nginx
    remote_src: True
    mode: 0644
  with_items:
   - "{{ files_to_copy.stdout_lines }}"

Nachteil ist, dass der Suchbefehl immer noch als "geändert" angezeigt wird.

3
dvanrensburg

Ich habe mich auch einen ganzen Tag damit beschäftigt! und fand schließlich die Lösung im Shell-Befehl anstelle von copy: oder command: wie folgt:

- hosts: remote-server-name
  gather_facts: no
  vars:
    src_path: "/path/to/source/"
    des_path: "/path/to/dest/"
  tasks:
  - name: Ansible copy files remote to remote
    Shell: 'cp -r {{ src_path }}/. {{ des_path }}'

unbedingt beachten: 1. src_path und des_path enden mit / symbol 2. Im Shell-Befehl endet der Pfad src_path mit ., der den gesamten Inhalt des Verzeichnisses .__ anzeigt. 3. Ich habe meinen remote-server-name beide in hosts verwendet: und führe Shell .__ aus. Abschnitt von Jenkins anstelle von remote_src: spezifizierer im Playbook.

Ich denke, es ist ein guter Rat, wenn Sie in jenkins den folgenden Befehl im Abschnitt "Shell ausführen" ausführen:

ansible-playbook  copy-payment.yml -i remote-server-name
2
foad322

Ich habe eine Problemumgehung für das rekursive Kopieren von Remote zu Remote gefunden:

- name: List files in /usr/share/easy-rsa
  find:
    path: /usr/share/easy-rsa
    recurse: yes
    file_type: any
  register: find_result

- name: Create the directories
  file:
    path: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
    state: directory
    mode: "{{ item.mode }}"
  with_items:
    - "{{ find_result.files }}"
  when:
    - item.isdir

- name: Copy the files
  copy:
    src: "{{ item.path }}"
    dest: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
    remote_src: yes
    mode: "{{ item.mode }}"
  with_items:
    - "{{ find_result.files }}"
  when:
    - item.isdir == False
1
agrimal

Unten arbeitete für mich

-name: Upload html app directory to Deployment Host
 copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
0
Sakharam Thorat

Dies fand ich eine ideale Lösung zum Kopieren von Dateien vom Ansible-Server auf den Remote-Server.

yaml-Datei kopieren

- hosts: localhost
  user: {{ user }}
  connection: ssh
  become: yes
  gather_facts: no
  tasks:
   - name: Creation of directory on remote server
     file:
       path: /var/lib/jenkins/.aws
       state: directory
       mode: 0755
     register: result
   - debug: 
       var: result

   - name: get file names to copy
     command: "find conf/.aws -type f"
     register: files_to_copy

   - name: copy files
     copy:
      src: "{{ item }}" 
      dest: "/var/lib/jenkins/.aws"
      owner: {{ user }}
      group: {{ group }}
      remote_src: True
      mode: 0644
     with_items:
      - "{{ files_to_copy.stdout_lines }}"
0
Prateek patel