ansible - delete unmanaged files from directory?

前端 未结 7 2014
情深已故
情深已故 2021-01-30 06:38

I want to recursively copy over a directory and render all .j2 files in there as templates. For this I am currently using the following lines:

7条回答
  •  不要未来只要你来
    2021-01-30 07:14

    We do this with our nginx files, since we want them to be in a special order, come from templates, but remove unmanaged ones this works:

      # loop through the nginx sites array and create a conf for each file in order
      # file will be name 01_file.conf, 02_file.conf etc
      - name: nginx_sites conf
        template: >
          src=templates/nginx/{{ item.1.template }}
          dest={{ nginx_conf_dir }}/{{ '%02d' % item.0 }}_{{ item.1.conf_name|default(item.1.template) }}
          owner={{ user }}
          group={{ group }}
          mode=0660
        with_indexed_items: nginx_sites
        notify:
          - restart nginx
        register: nginx_sites_confs
    
      # flatten and map the results into simple list
      # unchanged files have attribute dest, changed have attribute path
      - set_fact:
          nginx_confs: "{{ nginx_sites_confs.results|selectattr('dest', 'string')|map(attribute='dest')|list + nginx_sites_confs.results|selectattr('path', 'string')|map(attribute='path')|select|list }}"
        when: nginx_sites
    
      # get contents of conf dir
      - shell: ls -1 {{ nginx_conf_dir }}/*.conf
        register: contents
        when: nginx_sites
    
      # so we can delete the ones we don't manage
      - name: empty old confs
        file: path="{{ item }}" state=absent
        with_items: contents.stdout_lines
        when: nginx_sites and item not in nginx_confs
    

    The trick (as you can see) is that template and with_items have different attributes in the register results. Then you turn them into a list of files you manage and then get a list of the the directory and removed the ones not in that list.

    Could be done with less code if you already have a list of files. But in this case I'm creating an indexed list so need to create the list as well with map.

提交回复
热议问题