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
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.
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.
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
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 )
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.
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
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
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
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 }}"