Skip to content

Commit db84f78

Browse files
committed
Add support for key in CephX keyring definition
The cephadm_key Ansible module now supports defining key for CephX keyrings, enabling more flexible key management and integration within Ceph clusters. This feature is particularly useful with Kolla-Ansible, as it allows clear definition of keys with specific capabilities and key values. Keys can now be stored securely in Git configurations or Vault, simplifying management across both projects. Resolves #165
1 parent 65400b9 commit db84f78

File tree

3 files changed

+85
-22
lines changed

3 files changed

+85
-22
lines changed

plugins/module_utils/cephadm_common.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,31 @@
2020
import datetime
2121

2222

23-
def generate_ceph_cmd(sub_cmd, args):
23+
def generate_ceph_cmd(sub_cmd, args, key_entry=None):
2424
'''
2525
Generate 'ceph' command line to execute
2626
'''
27-
28-
cmd = [
29-
'cephadm',
30-
'--timeout',
31-
'60',
32-
'shell',
33-
'--',
34-
'ceph',
35-
]
36-
cmd.extend(sub_cmd + args)
27+
cmd = []
28+
29+
if key_entry:
30+
cmd = [
31+
'cephadm',
32+
'shell',
33+
'--',
34+
'bash',
35+
'-c',
36+
f'echo -e "{key_entry}" | ceph {" ".join(sub_cmd)} {" ".join(args)}'
37+
]
38+
else:
39+
cmd = [
40+
'cephadm',
41+
'--timeout',
42+
'60',
43+
'shell',
44+
'--',
45+
'ceph',
46+
]
47+
cmd.extend(sub_cmd + args)
3748

3849
return cmd
3950

plugins/modules/cephadm_key.py

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
default: {}
5858
required: false
5959
type: dict
60+
key:
61+
description:
62+
- Secret value of the key. If specified, this key will be
63+
used explicitly instead of being generated.
64+
required: false
65+
type: str
6066
output_format:
6167
description:
6268
- The key output format when retrieving the information of an
@@ -150,6 +156,25 @@ def create_key(name, caps): # noqa: E501
150156
return cmd
151157

152158

159+
def create_key_by_import(name, caps, key):
160+
'''
161+
Create a CephX key by import
162+
'''
163+
cmd = []
164+
165+
caps_cli = []
166+
for k, v in caps.items():
167+
caps_cli.append(f'caps {k} = "{v}"')
168+
169+
key_entry = f"[{name}]\n\tkey = {key}\n\t" + "\n\t".join(caps_cli)
170+
171+
sub_cmd = ['auth', 'import']
172+
args = ['-i', '-']
173+
cmd.append(generate_ceph_cmd(sub_cmd=sub_cmd, args=args, key_entry=key_entry))
174+
175+
return cmd
176+
177+
153178
def update_key(name, caps):
154179
'''
155180
Update the caps of a CephX key
@@ -168,6 +193,15 @@ def update_key(name, caps):
168193
return cmd
169194

170195

196+
def update_key_by_import(name, caps, key=None):
197+
'''
198+
Update a CephX key by re-importing it
199+
'''
200+
cmd = create_key_by_import(name, caps, key)
201+
202+
return cmd
203+
204+
171205
def delete_key(name):
172206
'''
173207
Delete a CephX key
@@ -264,6 +298,7 @@ def run_module():
264298
state=dict(type='str', required=False, default='present', choices=['present', 'absent', # noqa: E501
265299
'list', 'info']), # noqa: E501
266300
caps=dict(type='dict', required=False, default={}),
301+
key=dict(type='str', required=False, default=None),
267302
output_format=dict(type='str', required=False, default='json', choices=['json', 'plain', 'xml', 'yaml']) # noqa: E501
268303
)
269304

@@ -276,6 +311,7 @@ def run_module():
276311
state = module.params['state']
277312
name = module.params.get('name')
278313
caps = module.params.get('caps')
314+
key = module.params.get('key')
279315
output_format = module.params.get('output_format')
280316

281317
changed = False
@@ -313,25 +349,40 @@ def run_module():
313349
if not caps:
314350
caps = _info_key[0]['caps']
315351
_caps = _info_key[0]['caps']
316-
if caps == _caps:
352+
if not key:
353+
key = _info_key[0]['key']
354+
_key = _info_key[0]['key']
355+
if caps == _caps and key == _key:
317356
result["stdout"] = "{0} already exists and doesn't need to be updated.".format(name) # noqa: E501
318357
result["rc"] = 0
319358
module.exit_json(**result)
320359
else:
321-
rc, cmd, out, err = exec_commands(module, update_key(name, caps)) # noqa: E501
360+
if key and key != _key:
361+
rc, cmd, out, err = exec_commands(
362+
module, update_key_by_import(name, caps, key)) # noqa: E501
363+
else:
364+
rc, cmd, out, err = exec_commands(
365+
module, update_key(name, caps)) # noqa: E501
322366
if rc != 0:
323-
result["stdout"] = "Couldn't update caps for {0}".format(name)
367+
result["stdout"] = "Couldn't update {0}".format(name)
324368
result["stderr"] = err
325369
module.exit_json(**result)
326370
changed = True
327-
328371
else:
329-
rc, cmd, out, err = exec_commands(module, create_key(name, caps)) # noqa: E501
330-
if rc != 0:
331-
result["stdout"] = "Couldn't create {0}".format(name)
332-
result["stderr"] = err
333-
module.exit_json(**result)
334-
changed = True
372+
if key:
373+
rc, cmd, out, err = exec_commands(module, create_key_by_import(name, caps, key))
374+
if rc != 0:
375+
result["stdout"] = "Couldn't import {0}".format(name)
376+
result["stderr"] = err
377+
module.exit_json(**result)
378+
changed = True
379+
else:
380+
rc, cmd, out, err = exec_commands(module, create_key(name, caps)) # noqa: E501
381+
if rc != 0:
382+
result["stdout"] = "Couldn't create {0}".format(name)
383+
result["stderr"] = err
384+
module.exit_json(**result)
385+
changed = True
335386

336387
elif state == "absent":
337388
rc, cmd, out, err = exec_commands(

roles/keys/tasks/main.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
name: "{{ item.name }}"
55
state: "{{ item.state | default(omit) }}"
66
caps: "{{ item.caps }}"
7-
secret: "{{ item.key | default(omit) }}"
7+
key: "{{ item.key | default(omit) }}"
88
with_items: "{{ cephadm_keys }}"
99
delegate_to: "{{ groups['mons'][0] }}"
1010
run_once: true
11+
no_log: "{{ item.key is defined }}"

0 commit comments

Comments
 (0)