KNCK
KNCK

Reputation: 101

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

Upvotes: 0

Views: 1351

Answers (1)

Khaled
Khaled

Reputation: 838

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

Upvotes: 2

Related Questions