Skip to content
Snippets Groups Projects
gitlab_host.py 3.46 KiB
Newer Older
#!/usr/bin/python

RETURN = '''# '''

from subprocess import call
import string

try:
    import gitlab
    HAS_GITLAB_PACKAGE = True
except:
    HAS_GITLAB_PACKAGE = False


def main():
    module = AnsibleModule(
        argument_spec=dict(
            server_url=dict(required=True),
            validate_certs=dict(required=False, default=True, type='bool', aliases=['verify_ssl']),
            login_user=dict(required=False, no_log=True),
            login_password=dict(required=False, no_log=True),
            login_token=dict(required=False, no_log=True),
            company=dict(required=True),
            hostname=dict(required=True),
        ),
        supports_check_mode=True
    )

    if not HAS_GITLAB_PACKAGE:
        module.fail_json(msg="Missing required gitlab module (check docs or install with: pip install python-gitlab")

    server_url = module.params['server_url']
    verify_ssl = module.params['validate_certs']
    login_user = module.params['login_user']
    login_password = module.params['login_password']
    login_token = module.params['login_token']
    company = module.params['company']
    hostname = module.params['hostname']

    # We need both login_user and login_password or login_token, otherwise we fail.
    if login_user is not None and login_password is not None:
        use_credentials = True
    elif login_token is not None:
        use_credentials = False
    else:
        module.fail_json(msg="No login credentials are given. Use login_user with login_password, or login_token")
        return

    # Lets make a connection to the Gitlab server_url, with either login_user and login_password
    # or with login_token
    try:
        if use_credentials:
            git = gitlab.Gitlab(server_url, email=login_user, password=login_password, ssl_verify=verify_ssl) # type: gitlab
        else:
            git = gitlab.Gitlab(server_url, login_token, ssl_verify=verify_ssl) # type: gitlab
        git.auth()
    except Exception, e:
        module.fail_json(msg="Failed to connect to Gitlab server: %s " % e)
        return

    try:
        group = git.groups.get('ansible-inventories') # type: gitlab.Group
        hgroup = git.groups.get(group.subgroups.list(search='hosts')[0].id) # type: gitlab.Group
        cgroup = git.groups.get(hgroup.subgroups.list(search=company)[0].id) # type: gitlab.Group
        projects = cgroup.projects.list(search=hostname)
        if projects:
            changed = False
            gproject = projects[0]
        else:
            changed = True
            gproject = git.projects.create({
                'name': hostname,
                'namespace_id': cgroup.id,
            })
            # Add remote repo to etckeeper git repo
            cmd = ['git', 'remote', 'add', 'origin', '%s:ansible-inventories/hosts/%s/%s.git' % (string.replace(server_url, 'https://', 'git@'), company, hostname)]
            call(cmd, cwd='/etc')

        project = git.projects.get(gproject.id) # type: gitlab.Project
        project.keys.create({
            'title': 'root@%s' % hostname,
            'key': open('/root/.ssh/id_rsa.pub').read(),
            'can_push': True,
        })
    except Exception, e:
        module.fail_json(msg="Creating new host project failed: %s" % e.message, response=e)
        return

    module.exit_json(changed=changed, result="Successfully created project %s/ansible-inventories/hosts/%s/%s" % (server_url, company, hostname))


from ansible.module_utils.basic import *

if __name__ == '__main__':
    main()