Skip to content

Commit d06ff9b

Browse files
committed
Add work from 20151127
1 parent 93352f3 commit d06ff9b

File tree

3 files changed

+115
-31
lines changed

3 files changed

+115
-31
lines changed

README.md

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,74 @@
11
PowerDNS Ansible library
22
==========
3+
- [Introduction](#introduction)
34
- [Usage](#usage)
5+
- [Zones](#zones)
6+
- [Records](#records)
47

58
# Usage
69

7-
Ensure zone does exist
10+
## Zones
11+
Ensure zone is present
12+
813
```yaml
914
- powerdns_zone:
10-
name: zone.example.com
15+
name: zone01.internal.example.com
1116
nameservers:
1217
- ns-01.example.com
1318
- ns-02.example.com
1419
kind: master
1520
state: present
1621
pdns_host: powerdns.example.com
1722
pdns_port: 8081
18-
pdns_prot: http
23+
pdns_api_key: topsecret
24+
```
25+
26+
Ensure zone is absent
27+
```yaml
28+
- powerdns_zone:
29+
name: zone02.internal.example.com
30+
state: absent
31+
pdns_host: powerdns.example.com
32+
pdns_port: 8081
33+
pdns_api_key: topsecret
34+
```
35+
36+
## Records
37+
38+
Ensure A record
39+
```yaml
40+
- powerdns_record:
41+
name: host01
42+
zone: zone01.internal.example.com
43+
type: A
44+
content: 192.168.1.234
45+
ttl: 1440
46+
pdns_host: powerdns.example.com
47+
pdns_port: 8081
48+
pdns_api_key: topsecret
49+
```
50+
51+
Ensure AAAA record
52+
```yaml
53+
- powerdns_record:
54+
name: host01
55+
zone: zone01.internal.example.com
56+
type: AAAA
57+
content: 2001:cdba:0000:0000:0000:0000:3257:9652
58+
ttl: 1440
59+
pdns_host: powerdns.example.com
60+
pdns_port: 8081
61+
pdns_api_key: topsecret
62+
```
63+
64+
Ensure CNAME record
65+
```yaml
66+
- powerdns_record:
67+
name: database
68+
zone: zone01.internal.example.com
69+
type: CNAME
70+
content: host01.zone01.internal.example.com
71+
pdns_host: powerdns.example.com
72+
pdns_port: 8081
1973
pdns_api_key: topsecret
2074
```

powerdns_record.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,30 @@
88
description:
99
- Create, update or delete a PowerDNS records using API
1010
options:
11+
content:
12+
description:
13+
- Content of the record
14+
- Could be an ip address or hostname
1115
name:
1216
description:
1317
- Record name
18+
- If name is not an FQDN, zone will be added at the end to create an FQDN
1419
required: true
1520
server:
1621
description:
17-
- Server name
22+
- Server name.
1823
required: false
1924
default: localhost
25+
ttl:
26+
description:
27+
- Record TTL
28+
required: false
29+
default: 86400
2030
type:
2131
description:
2232
- Record type
2333
required: false
24-
choices: ['A', 'AAAA', 'PTR']
34+
choices: ['A', 'AAAA', 'CNAME', 'MX', 'PTR', 'SRV']
2535
default: None
2636
zone:
2737
description:
@@ -39,7 +49,7 @@
3949
default: 8081
4050
pdns_prot:
4151
description:
42-
- Protocol used to connect to PowerDNS API
52+
- Protocol used by PowerDNS API
4353
required: false
4454
default: http
4555
choices: ['http', 'https']
@@ -115,42 +125,52 @@ def get_zone(self, server, name):
115125
return None
116126
return self._handle_request(req)
117127

118-
def create_record(self, server, zone, name, rtype, content):
128+
def get_record(self, server, zone, name):
129+
return dict()
130+
131+
def create_record(self, server, zone, name, rtype, content, disabled, ttl):
119132
url = self._get_zone_url(server=server, name=zone)
120133
record_content = list()
121-
record_content.append(dict(content=content, disabled='false', name=name, ttl=86400, type=rtype))
134+
record_content.append(dict(content=content, disabled=disabled, name=name, ttl=ttl, type=rtype))
122135
record = dict(name=name, type=rtype, changetype='REPLACE', records=record_content)
123136
rrsets = list()
124137
rrsets.append(record)
125138
data = dict(rrsets=rrsets)
139+
# module.fail_json(msg='{data} {url}'.format(data=json.dumps(data), url=url))
126140
req = requests.patch(url=url, data=json.dumps(data), headers=self.headers)
127141
return self._handle_request(req)
128142

129143

130144
def ensure(module, pdns_client):
131145
content = module.params['content']
132-
rtype = module.params['type']
133-
zone = module.params['zone']
146+
disabled = module.params['disabled']
134147
name = module.params['name']
135-
if not zone in name:
136-
name = '{name}.{zone}'.format(name=name, zone=zone)
148+
rtype = module.params['type']
149+
ttl = module.params['ttl']
150+
zone_name = module.params['zone']
151+
152+
if not zone_name in name:
153+
name = '{name}.{zone}'.format(name=name, zone=zone_name)
137154
server = module.params['server']
138155
state = module.params['state']
139156

140157
try:
141-
zone = pdns_client.get_zone(server, zone)
158+
zone = pdns_client.get_zone(server, zone_name)
142159
except PowerDNSError as e:
143160
module.fail_json(
144-
msg='Could not get zone {name}: HTTP {code}: {err}'.format(name=zone, code=e.status_code, err=e.message))
161+
msg='Could not get zone {name}: HTTP {code}: {err}'.format(name=zone_name, code=e.status_code,
162+
err=e.message))
145163

146164
if not zone:
147-
module.fail_json(msg='Zone not found: {name}'.format(zone=zone))
165+
module.fail_json(msg='Zone not found: {name}'.format(zone=zone_name))
148166

149167
records = zone.get('records')
150168
record = next((item for item in records if item['content'] == content), None)
151169
if not record and state == 'present':
152170
try:
153-
pdns_client.create_record(server=server, zone=zone, name=name, rtype=rtype, content=content)
171+
pdns_client.create_record(server=server, zone=zone_name, name=name, rtype=rtype, content=content, ttl=ttl,
172+
disabled=disabled)
173+
return True, pdns_client.get_record(server=server, zone=zone_name, name=name)
154174
except PowerDNSError as e:
155175
module.fail_json(
156176
msg='Could not create record {name}: HTTP {code}: {err}'.format(name=name, code=e.status_code,
@@ -159,14 +179,16 @@ def ensure(module, pdns_client):
159179

160180

161181
def main():
162-
global module
182+
# global module
163183
module = AnsibleModule(
164184
argument_spec=dict(
165185
content=dict(type='str', required=False),
186+
disabled=dict(type='bool', default=False),
166187
name=dict(type='str', required=True),
167188
server=dict(type='str', default='localhost'),
168189
state=dict(type='str', default='present', choices=['present', 'absent']),
169-
type=dict(type='str', required=False, choices=['A', 'AAAA', 'PTR']),
190+
ttl=dict(type='int', default=86400),
191+
type=dict(type='str', required=False, choices=['A', 'AAAA', 'CNAME', 'MX', 'PTR', 'SRV']),
170192
zone=dict(type='str', required=True),
171193
pdns_host=dict(type='str', default='127.0.0.1'),
172194
pdns_port=dict(type='int', default=8081),

powerdns_zone.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
'''
4747

4848
EXAMPLES = '''
49+
# Ensure a zone is present
4950
- powerdns_zone:
5051
name: zone01.internal.example.com
5152
kind: master
@@ -55,7 +56,14 @@
5556
state: present
5657
pdns_host: powerdns.example.cm
5758
pdns_port: 8080
58-
pdns_prot: http
59+
pdns_api_key: topsecret
60+
61+
# Ensure a zone is absent
62+
- powerdns_zone:
63+
name: old-zone.internal.example.com
64+
state: absent
65+
pdns_host: powerdns.example.cm
66+
pdns_port: 8080
5967
pdns_api_key: topsecret
6068
'''
6169

@@ -170,18 +178,18 @@ def ensure(module, pdns_client):
170178
module.fail_json(
171179
msg='Could not delete zone {name}: HTTP {code}: {err}'.format(name=name, code=e.status_code,
172180
err=e.message))
173-
# Compare nameservers
174-
# ns_diff = diff(nameservers if nameservers else list(), zone.get('nameservers', list()))
175-
# if ns_diff:
176-
# try:
177-
# if module.check_mode:
178-
# module.exit_json(changed=True, zone=zone)
179-
# pdns_client.update_zone(server, zone)
180-
# return True, pdns_client.get_zone(name)
181-
# except PowerDNSError as e:
182-
# module.fail_json(
183-
# msg='Could not update zone {name}: HTTP {code}: {err}'.format(name=name, code=e.status_code,
184-
# err=e.message))
181+
# Compare nameservers
182+
# ns_diff = diff(nameservers if nameservers else list(), zone.get('nameservers', list()))
183+
# if ns_diff:
184+
# try:
185+
# if module.check_mode:
186+
# module.exit_json(changed=True, zone=zone)
187+
# pdns_client.update_zone(server, zone)
188+
# return True, pdns_client.get_zone(name)
189+
# except PowerDNSError as e:
190+
# module.fail_json(
191+
# msg='Could not update zone {name}: HTTP {code}: {err}'.format(name=name, code=e.status_code,
192+
# err=e.message))
185193
return False, zone
186194

187195

0 commit comments

Comments
 (0)