Skip to content

Commit 2a09d8d

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 f526856 commit 2a09d8d

File tree

3 files changed

+82
-21
lines changed

3 files changed

+82
-21
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: 58 additions & 9 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
@@ -318,20 +354,33 @@ def run_module():
318354
result["rc"] = 0
319355
module.exit_json(**result)
320356
else:
321-
rc, cmd, out, err = exec_commands(module, update_key(name, caps)) # noqa: E501
357+
if key and key != _key:
358+
rc, cmd, out, err = exec_commands(
359+
module, update_key_by_import(name, caps, key)) # noqa: E501
360+
else:
361+
rc, cmd, out, err = exec_commands(
362+
module, update_key(name, caps)) # noqa: E501
322363
if rc != 0:
323-
result["msg"] = "Couldn't update caps for {0}".format(name)
364+
result["stdout"] = "Couldn't update {0}".format(name)
324365
result["stderr"] = err
325-
module.fail_json(**result)
366+
module.exit_json(**result)
326367
changed = True
327368

328369
else:
329-
rc, cmd, out, err = exec_commands(module, create_key(name, caps)) # noqa: E501
330-
if rc != 0:
331-
result["msg"] = "Couldn't create {0}".format(name)
332-
result["stderr"] = err
333-
module.fail_json(**result)
334-
changed = True
370+
if key:
371+
rc, cmd, out, err = exec_commands(module, create_key_by_import(name, caps, key))
372+
if rc != 0:
373+
result["stdout"] = "Couldn't import {0}".format(name)
374+
result["stderr"] = err
375+
module.exit_json(**result)
376+
changed = True
377+
else:
378+
rc, cmd, out, err = exec_commands(module, create_key(name, caps)) # noqa: E501
379+
if rc != 0:
380+
result["stdout"] = "Couldn't create {0}".format(name)
381+
result["stderr"] = err
382+
module.exit_json(**result)
383+
changed = True
335384

336385
elif state == "absent":
337386
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)