Search code examples
ansiblerenamemove

Find/list files with specific extension and rename them dynamically using ansible playbook


I'm trying to rename a jar file in a path for deployment using ansible and it is successful. I have tried multiple ways but still, it's failing, For example, there are multiple Jar files in the path /appdata/tomcat/lib/jars/ we havemultiple jar files with version numbers like below

app_deploy-1.1.1.jar

app_deploy-1.1.2_old_1.jar

app_deploy-1.1.2.jar_before

app_deploy-1.1.2_old_2022.jar

app_deploy-1.1.2_before.jar

I have move all files with .jar extension with date using custom date variable {deploy_date} like this app_deploy-1.1.2_before.jar_{deploy_date}

I have method 1 as below :

 - name: Get the name of the current jar files
   shell:  ls -l /appdata/tomcat/lib/jars/ | grep .*.jar
   register: jar_files_list

 - debug:
     msg: "{{ jar_files_list }}"

 - name: Get the date
   shell: date +%Y%m%d%H%M%S
   register: timestamp
   when: jar_files_list.stdout != ''
 
 - name: Rename the current jar file
   file:
     src: /appdata/tomcat/lib/jars/{{ jar_files_list }}
     dest: /appdata/tomcat/lib/jars/{{ jar_files_list }}_{{ ansible_date_time.date }}_backup
   when: jar_files_list.stdout != ''

I have method 2 as below :

    - name: Rename the current jar files
      shell: mv /appdata/tomcat/lib/jars/*.jar {{ repo_name }}-*.jar_backup_{{ ansible_date_time.date }}
     
    - name: Move current filesto backup directory
      shell: mv /appdata/tomcat/lib/jars/{{ repo_name }}-.*.jar /appdata/tomcat/lib/jars//backup_jars/`

Both of the solutions doest work, can someone help me with some solutions


Solution

  • The find module can be used to find and generate a list of files located on a remote host based on a pattern:

      - name: Get jars in {{ jars_path }}
        find:
          paths: "{{ jars_path }}"
          file_type: file
          patterns: '*.jar'
        register: jars_list
    

    The output will be a dictionary of only the *.jar files in the specified path:

    TASK [Get jars in /appdata/tomcat/lib/jars] ************************
    ok: [test-001] => {
        "changed": false,
        "examined": 4,
        "files": [
            {
                "atime": 1661249640.3583002,
                "ctime": 1661249640.3583002,
                "dev": 64768,
                "gid": 0,
                "gr_name": "root",
                "inode": 8980720,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1661249640.3583002,
                "nlink": 1,
                "path": "/appdata/tomcat/lib/jars/test1.jar",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 0,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            },
            {
                "atime": 1661249640.3583002,
                "ctime": 1661249640.3583002,
                "dev": 64768,
                "gid": 0,
                "gr_name": "root",
                "inode": 8980722,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1661249640.3583002,
                "nlink": 1,
                "path": "/appdata/tomcat/lib/jars/test2.jar",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 0,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            },
            {
                "atime": 1661249640.3583002,
                "ctime": 1661249640.3583002,
                "dev": 64768,
                "gid": 0,
                "gr_name": "root",
                "inode": 8980726,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1661249640.3583002,
                "nlink": 1,
                "path": "/appdata/tomcat/lib/jars/test3.jar",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 0,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        ],
        "invocation": {
            "module_args": {
                "age": null,
                "age_stamp": "mtime",
                "contains": null,
                "depth": null,
                "excludes": null,
                "file_type": "file",
                "follow": false,
                "get_checksum": false,
                "hidden": false,
                "paths": [
                    "/appdata/tomcat/lib/jars"
                ],
                "patterns": [
                    "*.jar"
                ],
                "read_whole_file": false,
                "recurse": false,
                "size": null,
                "use_regex": false
            }
        },
        "matched": 3,
        "msg": "All paths examined",
        "skipped_paths": {}
    }
    

    "{{ jars_list.files }}" will list the files and .path will provide the full path of the file.
    Now the copy module with the option remote_src: yes can be used to rename the files:

      - name: Rename jars
        copy:
          src: "{{ item.path }}"
          dest: "{{ item.path }}_{{ deploy_date }}"
          remote_src: yes
        loop: "{{ jars_list.files }}"
    

    Delete the old files:

      - name: Remove old jars
        file:
          path: "{{ item.path }}"
          state: absent
        loop: "{{ jars_list.files }}"
    

    The complete playbook

    - hosts: all
      vars:
        deploy_date: "{{ ansible_date_time.date }}"
        jars_path: /appdata/tomcat/lib/jars
      tasks:
      - name: Get jars in {{ jars_path }}
        find:
          paths: "{{ jars_path }}"
          file_type: file
          patterns: '*.jar'
        register: jars_list
    
      - name: Rename jars
        copy:
          src: "{{ item.path }}"
          dest: "{{ item.path }}_{{ deploy_date }}"
          remote_src: yes
        loop: "{{ jars_list.files }}"
    
      - name: Remove old jars
        file:
          path: "{{ item.path }}"
          state: absent
        loop: "{{ jars_list.files }}"