Création d’un module pour ansible

Premier fichier : library/file_backup.py
Le programme python qui effectue le backup du fichier. En paramètre nous aurons besoins du fichier source et de manière facultative de l’extension utilisé pour le backup. Par défaut l’extension sera au format YYMMDD_HHmmSS

#!/usr/bin/python
# -*- coding: utf-8 -*-

DOCUMENTATION = '''
---
module: file_backup
short_description: Backup a file from source adding an extension to it
description:
    - This module allows you to backup a file from a source location.
    - It provides the ability to overwrite existing files and preserve file permissions.
version_added: "1.0"
author: "Ludovic"
options:
    src:
        description:
            - Path to the source file on the control machine.
        required: true
    ext:
        description:
            - Extention of the backup file
        required: false
        default: timestamp
    overwrite:
        description:
            - Whether to overwrite the destination file if it already exists.
        required: false
        default: true
notes:
    - The sourcepaths should be absolute paths.
requirements:
    - This module requires Python 2 or 3 on the remote machine.
'''

EXAMPLES = '''
- name: Backup file
  file_backup:
    src: "/path/to/source/file"
    ext: "bak"
    overwrite: true
'''

RETURN = '''
src:
    description: Path of the source file.
    type: str
    returned: always
ext:
    description: extention of the file used
    type: str
    returned: always
changed:
    description: Indicates whether the file was copied or not.
    type: bool
    returned: always
'''

from ansible.module_utils.basic import AnsibleModule
import shutil
import os.path
import datetime

def ToTen(number):
    retour=str(number).zfill(2)
    return retour

def TimeStamp():
    now = datetime.datetime.now()
    retour = ToTen(now.year) + ToTen(now.month) + ToTen(now.day) + "_" + ToTen(now.hour)  + ToTen(now.minute) + ToTen(now.second)
    return retour

def main():
    module = AnsibleModule(
        argument_spec=dict(
            src=dict(required=True, type='path'),
            ext=dict(required=False, default=TimeStamp(), type='str'),
            overwrite=dict(required=False, default=True, type='bool')
        )
    )

    src = module.params['src']
    ext = module.params['ext']
    dest = module.params['src']+"."+ext
    overwrite = module.params['overwrite']

    try:
        if (os.path.isfile(dest) and not(overwrite)):
            module.exit_json(
                changed=False,
                src=src,
                ext=ext
            )
        else:
            shutil.copy2(src, dest)
            module.exit_json(
                changed=True,
                src=src,
                ext=ext
            )
    except Exception as e:
        module.fail_json(msg=str(e))

if __name__ == '__main__':
    main()

Le fichier library/file_backup.args.json sert à faire des tests unitaires sur le module.
Il s’agit d’un fichier json qui simule l’appel depuis ansible

{ "ANSIBLE_MODULE_ARGS": {
  "src": "toto",
  "ext": "bak",
  "overwrite":  false
 }
}
$ ./library/file_backup.py  library/file_backup.args.json

{"invocation": {"module_args": {"src": "toto", "ext": "bak", "overwrite": false}}, "src": "toto", "ext": "bak", "changed": true}
$ ./library/file_backup.py  library/file_backup.args.json

{"invocation": {"module_args": {"src": "toto", "ext": "bak", "overwrite": false}}, "src": "toto", "ext": "bak", "changed": false}

Pour utiliser le module il faut modifier le fichier ansible.cfg pour rajouter la ligne

[defaults]
library        = library/

Et enfin le code yaml pour invoquer la fonction : file_backup.yml

- name: Backup file
  hosts: localhost
  tasks:
    - name: Backup file
      file_backup:
        src: /tmp/test.conf
        ext: "bak"
        overwrite: true
      register: backup

    - name: Debug
      debug:
        msg: "{{ backup }}"

Publié

dans

par

Étiquettes :

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *