-
Notifications
You must be signed in to change notification settings - Fork 396
/
redshift_info.py
344 lines (314 loc) · 10.1 KB
/
redshift_info.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright: Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
DOCUMENTATION = r"""
---
module: redshift_info
version_added: 1.0.0
author:
- "Jens Carl (@j-carl)"
short_description: Gather information about Redshift cluster(s)
description:
- Gather information about Redshift cluster(s).
options:
cluster_identifier:
description:
- The prefix of cluster identifier of the Redshift cluster you are searching for.
- "This is a regular expression match with implicit '^'. Append '$' for a complete match."
required: false
aliases: ['name', 'identifier']
type: str
tags:
description:
- "A dictionary/hash of tags in the format { tag1_name: 'tag1_value', tag2_name: 'tag2_value' }
to match against the security group(s) you are searching for."
required: false
type: dict
extends_documentation_fragment:
- amazon.aws.region.modules
- amazon.aws.common.modules
- amazon.aws.boto3
"""
EXAMPLES = r"""
# Note: These examples do net set authentication details, see the AWS guide for details.
- name: Find all clusters
community.aws.redshift_info:
register: redshift
- name: Find cluster(s) with matching tags
community.aws.redshift_info:
tags:
env: prd
stack: monitoring
register: redshift_tags
- name: Find cluster(s) with matching name/prefix and tags
community.aws.redshift_info:
tags:
env: dev
stack: web
name: user-
register: redshift_web
- name: Fail if no cluster(s) is/are found
community.aws.redshift_info:
tags:
env: stg
stack: db
register: redshift_user
failed_when: "{{ redshift_user.results | length == 0 }}"
"""
RETURN = r"""
# For more information see U(http://boto3.readthedocs.io/en/latest/reference/services/redshift.html#Redshift.Client.describe_clusters)
---
cluster_identifier:
description: Unique key to identify the cluster.
returned: success
type: str
sample: "redshift-identifier"
node_type:
description: The node type for nodes in the cluster.
returned: success
type: str
sample: "ds2.xlarge"
cluster_status:
description: Current state of the cluster.
returned: success
type: str
sample: "available"
modify_status:
description: The status of a modify operation.
returned: optional
type: str
sample: ""
master_username:
description: The master user name for the cluster.
returned: success
type: str
sample: "admin"
db_name:
description: The name of the initial database that was created when the cluster was created.
returned: success
type: str
sample: "dev"
endpoint:
description: The connection endpoint.
returned: success
type: str
sample: {
"address": "cluster-ds2.ocmugla0rf.us-east-1.redshift.amazonaws.com",
"port": 5439
}
cluster_create_time:
description: The date and time that the cluster was created.
returned: success
type: str
sample: "2016-05-10T08:33:16.629000+00:00"
automated_snapshot_retention_period:
description: The number of days that automatic cluster snapshots are retained.
returned: success
type: int
sample: 1
cluster_security_groups:
description: A list of cluster security groups that are associated with the cluster.
returned: success
type: list
sample: []
vpc_security_groups:
description: A list of VPC security groups the are associated with the cluster.
returned: success
type: list
sample: [
{
"status": "active",
"vpc_security_group_id": "sg-12cghhg"
}
]
cluster_paramater_groups:
description: The list of cluster parameters that are associated with this cluster.
returned: success
type: list
sample: [
{
"cluster_parameter_status_list": [
{
"parameter_apply_status": "in-sync",
"parameter_name": "statement_timeout"
},
{
"parameter_apply_status": "in-sync",
"parameter_name": "require_ssl"
}
],
"parameter_apply_status": "in-sync",
"parameter_group_name": "tuba"
}
]
cluster_subnet_group_name:
description: The name of the subnet group that is associated with the cluster.
returned: success
type: str
sample: "redshift-subnet"
vpc_id:
description: The identifier of the VPC the cluster is in, if the cluster is in a VPC.
returned: success
type: str
sample: "vpc-1234567"
availability_zone:
description: The name of the Availability Zone in which the cluster is located.
returned: success
type: str
sample: "us-east-1b"
preferred_maintenance_window:
description: The weekly time range, in Universal Coordinated Time (UTC), during which system maintenance can occur.
returned: success
type: str
sample: "tue:07:30-tue:08:00"
pending_modified_values:
description: A value that, if present, indicates that changes to the cluster are pending.
returned: success
type: dict
sample: {}
cluster_version:
description: The version ID of the Amazon Redshift engine that is running on the cluster.
returned: success
type: str
sample: "1.0"
allow_version_upgrade:
description: >
A Boolean value that, if true, indicates that major version upgrades will be applied
automatically to the cluster during the maintenance window.
returned: success
type: bool
sample: true|false
number_of_nodes:
description: The number of compute nodes in the cluster.
returned: success
type: int
sample: 12
publicly_accessible:
description: A Boolean value that, if true , indicates that the cluster can be accessed from a public network.
returned: success
type: bool
sample: true|false
encrypted:
description: Boolean value that, if true , indicates that data in the cluster is encrypted at rest.
returned: success
type: bool
sample: true|false
restore_status:
description: A value that describes the status of a cluster restore action.
returned: success
type: dict
sample: {}
hsm_status:
description: >
A value that reports whether the Amazon Redshift cluster has finished applying any hardware
security module (HSM) settings changes specified in a modify cluster command.
returned: success
type: dict
sample: {}
cluster_snapshot_copy_status:
description: A value that returns the destination region and retention period that are configured for cross-region snapshot copy.
returned: success
type: dict
sample: {}
cluster_public_keys:
description: The public key for the cluster.
returned: success
type: str
sample: "ssh-rsa anjigfam Amazon-Redshift\n"
cluster_nodes:
description: The nodes in the cluster.
returned: success
type: list
sample: [
{
"node_role": "LEADER",
"private_ip_address": "10.0.0.1",
"public_ip_address": "x.x.x.x"
},
{
"node_role": "COMPUTE-1",
"private_ip_address": "10.0.0.3",
"public_ip_address": "x.x.x.x"
}
]
elastic_ip_status:
description: The status of the elastic IP (EIP) address.
returned: success
type: dict
sample: {}
cluster_revision_number:
description: The specific revision number of the database in the cluster.
returned: success
type: str
sample: "1231"
tags:
description: The list of tags for the cluster.
returned: success
type: list
sample: []
kms_key_id:
description: The AWS Key Management Service (AWS KMS) key ID of the encryption key used to encrypt data in the cluster.
returned: success
type: str
sample: ""
enhanced_vpc_routing:
description: An option that specifies whether to create the cluster with enhanced VPC routing enabled.
returned: success
type: bool
sample: true|false
iam_roles:
description: List of IAM roles attached to the cluster.
returned: success
type: list
sample: []
"""
import re
try:
from botocore.exceptions import BotoCoreError
from botocore.exceptions import ClientError
except ImportError:
pass # caught by AnsibleAWSModule
from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict
from ansible_collections.community.aws.plugins.module_utils.modules import AnsibleCommunityAWSModule as AnsibleAWSModule
def match_tags(tags_to_match, cluster):
for key, value in tags_to_match.items():
for tag in cluster["Tags"]:
if key == tag["Key"] and value == tag["Value"]:
return True
return False
def find_clusters(conn, module, identifier=None, tags=None):
try:
cluster_paginator = conn.get_paginator("describe_clusters")
clusters = cluster_paginator.paginate().build_full_result()
except (BotoCoreError, ClientError) as e:
module.fail_json_aws(e, msg="Failed to fetch clusters.")
matched_clusters = []
if identifier is not None:
identifier_prog = re.compile("^" + identifier)
for cluster in clusters["Clusters"]:
matched_identifier = True
if identifier:
matched_identifier = identifier_prog.search(cluster["ClusterIdentifier"])
matched_tags = True
if tags:
matched_tags = match_tags(tags, cluster)
if matched_identifier and matched_tags:
matched_clusters.append(camel_dict_to_snake_dict(cluster))
return matched_clusters
def main():
argument_spec = dict(
cluster_identifier=dict(type="str", aliases=["identifier", "name"]),
tags=dict(type="dict"),
)
module = AnsibleAWSModule(
argument_spec=argument_spec,
supports_check_mode=True,
)
cluster_identifier = module.params.get("cluster_identifier")
cluster_tags = module.params.get("tags")
redshift = module.client("redshift")
results = find_clusters(redshift, module, identifier=cluster_identifier, tags=cluster_tags)
module.exit_json(results=results)
if __name__ == "__main__":
main()