Tôi muốn chia sẻ kinh nghiệm của mình với trường hợp này.
Ansible from 2.2 đã có vòng lặp with_filetree cung cấp cách đơn giản để tải lên thư mục, liên kết, tệp tĩnh và thậm chí (!) Mẫu. Đó là cách tốt nhất để giữ cho thư mục cấu hình của tôi được đồng bộ hóa.
- name: etc config - Create directories
file:
path: "{{ nginx_conf_dir }}/{{ item.path }}"
state: directory
mode: 0755
with_filetree: etc/nginx
when: item.state == 'directory'
- name: etc config - Creating configuration files from templates
template:
src: "{{ item.src }}"
dest: "{{ nginx_conf_dir }}/{{ item.path | regex_replace('\\.j2$', '') }}"
mode: 0644
with_filetree: etc/nginx
when:
- item.state == "file"
- item.path | match('.+\.j2$') | bool
- name: etc config - Creating staic configuration files
copy:
src: "{{ item.src }}"
dest: "{{ nginx_conf_dir }}/{{ item.path }}"
mode: 0644
with_filetree: etc/nginx
when:
- item.state == "file"
- not (item.path | match('.+\.j2$') | bool)
- name: etc config - Recreate symlinks
file:
src: "{{ item.src }}"
dest: "{{ nginx_conf_dir }}/{{ item.path }}"
state: link
force: yes
mode: "{{ item.mode }}"
with_filetree: etc/nginx
when: item.state == "link"
Tiếp theo, chúng tôi có thể muốn xóa các tệp không sử dụng khỏi thư mục cấu hình. Thật đơn giản. Chúng tôi thu thập danh sách các tệp và tệp được tải lên tồn tại trên máy chủ từ xa, tiếp theo xóa sự khác biệt.
Nhưng chúng tôi có thể muốn có các tệp không được quản lý trong thư mục cấu hình. Tôi đã sử dụng chức năng -prune
của find
để tránh xóa các thư mục có tệp không được quản lý.
PS _ (Y) _ chắc chắn sau khi tôi đã xóa một số tập tin không được quản lý
- name: etc config - Gathering managed files
set_fact:
__managed_file_path: "{{ nginx_conf_dir }}/{{ item.path | regex_replace('\\.j2$', '') }}"
with_filetree: etc/nginx
register: __managed_files
- name: etc config - Convert managed files to list
set_fact: managed_files="{{ __managed_files.results | map(attribute='ansible_facts.__managed_file_path') | list }}"
- name: etc config - Gathering exist files (excluding .ansible_keep-content dirs)
shell: find /etc/nginx -mindepth 1 -type d -exec test -e '{}/.ansible_keep-content' \; -prune -o -print
register: exist_files
changed_when: False
- name: etc config - Delete unmanaged files
file: path="{{ item }}" state=absent
with_items: "{{ exist_files.stdout_lines }}"
when:
- item not in managed_files
Hoàn toàn dọn sạch thư mục đích trước khi sao chép có nghĩa là vở kịch sẽ luôn 'thay đổi'. Ngay cả khi không có thay đổi nào được thực hiện cho thư mục nguồn. Khi đổi tên cục bộ tệp (ví dụ: rsync-> render-> rename-> rsync), luôn có sự cố mà ansible sẽ báo cáo thay đổi (đổi tên) khi thực sự không có thay đổi. –
@keks 'changed_when: false' sẽ sửa lỗi – ffghfgh
Nhưng bạn muốn biết khi nào/nếu tệp cấu hình đã thay đổi để khởi động trình xử lý – dalore