#!/usr/bin/python | |
DOCUMENTATION = ''' | |
--- | |
module: github_repo | |
short_description: Manage your repos on Github | |
''' | |
EXAMPLES = ''' | |
- name: Create a github Repo | |
github_repo: | |
github_auth_key: "..." | |
name: "Hello-World" | |
description: "This is your first repository" | |
private: yes | |
has_issues: no | |
has_wiki: no | |
has_downloads: no | |
register: result | |
- name: Delete that repo | |
github_repo: | |
github_auth_key: "..." | |
name: "Hello-World" | |
state: absent | |
register: result | |
''' | |
from ansible.module_utils.basic import * | |
import requests | |
api_url = "https://api.github.com" | |
def github_repo_present(data): | |
api_key = data['github_auth_key'] | |
del data['state'] | |
del data['github_auth_key'] | |
headers = { | |
"Authorization": "token {}" . format(api_key) | |
} | |
url = "{}{}" . format(api_url, '/user/repos') | |
result = requests.post(url, json.dumps(data), headers=headers) | |
if result.status_code == 201: | |
return False, True, result.json() | |
if result.status_code == 422: | |
return False, False, result.json() | |
# default: something went wrong | |
meta = {"status": result.status_code, 'response': result.json()} | |
return True, False, meta | |
def github_repo_absent(data=None): | |
headers = { | |
"Authorization": "token {}" . format(data['github_auth_key']) | |
} | |
url = "{}/repos/{}/{}" . format(api_url, "toast38coza", data['name']) | |
result = requests.delete(url, headers=headers) | |
if result.status_code == 204: | |
return False, True, {"status": "SUCCESS"} | |
if result.status_code == 404: | |
result = {"status": result.status_code, "data": result.json()} | |
return False, False, result | |
else: | |
result = {"status": result.status_code, "data": result.json()} | |
return True, False, result | |
def main(): | |
fields = { | |
"github_auth_key": {"required": True, "type": "str"}, | |
"name": {"required": True, "type": "str"}, | |
"description": {"required": False, "type": "str"}, | |
"private": {"default": False, "type": "bool"}, | |
"has_issues": {"default": True, "type": "bool"}, | |
"has_wiki": {"default": True, "type": "bool"}, | |
"has_downloads": {"default": True, "type": "bool"}, | |
"state": { | |
"default": "present", | |
"choices": ['present', 'absent'], | |
"type": 'str' | |
}, | |
} | |
choice_map = { | |
"present": github_repo_present, | |
"absent": github_repo_absent, | |
} | |
module = AnsibleModule(argument_spec=fields) | |
is_error, has_changed, result = choice_map.get( | |
module.params['state'])(module.params) | |
if not is_error: | |
module.exit_json(changed=has_changed, meta=result) | |
else: | |
module.fail_json(msg="Error deleting repo", meta=result) | |
if __name__ == '__main__': | |
main() |

















I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I am working at Cotocus. I blog tech insights at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at I reviewed , and SEO strategies at Wizbrand.
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at PINTEREST
Rajesh Kumar at QUORA
Rajesh Kumar at WIZBRAND