|
|
-
-
- # rewrite of the create_container playbook in Python; this happens because
- # the module for LXC container shipped with ansible is not working right now
- #import lxc
-
- # liliks infrastructure
- #container_name = "gogs"
- #logical_volume_name = "vm_gogs"
- #lvm_volume_group = "sysvg"
- #filesystem_size = "5G"
-
- # lilik preferred distro
- #distro = "debian"
- #release = "jessie"
-
- # our host
- #backing_store = "lvm"
- #filesystem_type = "ext4"
- #
- #
- #lxc_create_options = {
- # "release": release,
- # "name": container_name,
- # "lvname": logical_volume_name,
- # "vgname": lvm_volume_group,
- # "fstype": filesystem_type,
- # "fssize": filesystem_size,
- #}
- #
- #container = lxc.Container(container_name)
- #container.create(distro, args=lxc_create_options)
- #container.start()
-
- #---
- #- hosts: mcfly
- # remote_user: root
- # tasks:
- # - name: create a lxc container
- # lxc_container:
- # name: gogs
- # backing_store: lvm
- # container_log: true
- # fs_size: 5G
- # fs_type: ext4
- # lv_name: vm_gogs
- # state: started
- # template: debian
- # template_options: --release jessie
- # vg_name: sysvg
- # container_command: apt-get update; apt-get install python
-
-
-
- from ansible.module_utils.basic import *
-
- class LilikContainer(object):
- """
- A generic lxc container manipulation object based on python-lxc
- """
- def __init__(self, module):
- self.module = module
- self.state = module.params['state']
- self.name = module.params['name']
- self.template = module.params['template']
- self.backing_store = module.params['backing_store']
- self.lvname = module.params['lv_name']
- self.vgname = module.params['vg_name']
- self.fstype = module.params['fs_type']
- self.fssize = module.params['fs_size']
-
- def create_container(self):
- """
- Create a lxc.Container object as specified in the playbook, use it
- to create a lxc container and returns the reference
- """
- container_options = {
- 'bdev': self.backing_store,
- 'lvname': self.lvname,
- 'vgname': self.vgname,
- 'fstype': self.fstype,
- 'fssize': self.fssize,
- 'bdev' : self.backing_store,
- }
- try:
- import lxc
- except ImportError:
- self.module.fail_json(changed=False, msg='Error importing lxc')
-
- container = lxc.Container(name = self.name)
-
- # TODO: python2-lxc does not like bdevtype but python-lxc does
- return container.create(
- template = self.template,
- args = container_options,
- # bdevtype = self.backing_store
- )
-
- def main():
-
- module = AnsibleModule(
- argument_spec = dict(
- backing_store = dict(
- default='dir',
- choices=['dir', 'lvm', 'loop', 'btrsf', 'overlayfs', 'zfs',],
- type='str',
- ),
- container_command = dict(
- type='str',
- ),
- fs_size = dict(
- required=False,
- default='5G',
- type='str',
- ),
- fs_type = dict(
- required=False,
- default='ext4',
- type='str',
- ),
- lv_name = dict(
- type='str',
- ),
- name = dict(
- required=True,
- type='str',
- ),
- state = dict(
- default='started',
- choices=['started', 'stopped', 'restarted', 'absent', 'frozen'],
- type='str',
- ),
- template = dict(
- required=False,
- default='ubuntu',
- type='str',
- ),
- template_options = dict(required=False),
- vg_name = dict(
- required=False,
- default='lxc',
- type='str',
- ),
- )
- )
-
- try:
- import lxc
- except ImportError:
- module.fail_json(changed=False, msg='liblxc is required for this module to work')
-
- container = LilikContainer(module)
-
- result = {}
- result['name'] = container.name
- result['state'] = container.state
-
- if container.state == 'absent':
-
- # destroy the container
- if container.destoy():
- module.exit_json(changed=True)
-
- # TODO: remove redundant test
- # test wether the container is absent or not
- if container.name in lxc.list_containers():
- module.fail_json(changed=False)
-
- # the container has been removed
- else:
- module.exit_json(changed=True)
- # end TODO: remove redundant test
-
- elif container.state in ['started', 'stopped', 'restarted', 'frozen']:
-
- # the container exists, just set the state as required
- if container.name in lxc.list_containers():
-
- container_actions_from_state = {
- 'started': container.start,
- 'stopped': container.stop,
- 'restarted': container.restart,
- 'frozen': container.freeze,
- }
-
- # selected action
- action = container_actions.get(container.state)
-
- if action():
- module.exit_json(changed=True)
- else:
- module.exit_json(changed=False)
-
- # the container does not exists, create it
- else:
- try:
- new_container = container.create_container()
- module.exit_json(changed=True)
- except Exception as e:
- module.fail_json(
- changed=False,
- msg='An excption was raised while creating the container',
- exception_message=str(e),
- )
-
- if __name__ == '__main__':
- main()
|