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 }}"
Laisser un commentaire