From 468e2264833286b80868db08b33579b247bb2b87 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 27 Sep 2019 09:23:38 -0500 Subject: [PATCH] ceph-daemon: autodetect uid/gid from container image Signed-off-by: Sage Weil --- src/ceph-daemon | 77 ++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/src/ceph-daemon b/src/ceph-daemon index 7f119ce9b9a..a43ad3be3b7 100755 --- a/src/ceph-daemon +++ b/src/ceph-daemon @@ -1,7 +1,5 @@ #!/usr/bin/env python3 -CEPH_USER_UID=167 -CEPH_USER_GID=167 DEFAULT_IMAGE='ceph/daemon-base' DATA_DIR='/var/lib/ceph' LOG_DIR='/var/log/ceph' @@ -43,41 +41,34 @@ def get_data_dir(base, fsid, t, n): def get_log_dir(base, fsid): return base + '/' + fsid -def get_daemon_args(fsid, daemon_type, daemon_id): +def get_daemon_args(fsid, daemon_type, daemon_id, uid, gid): r = [ '--default-admin-socket', '/var/run/ceph/' + fsid + '-' + daemon_type + '.' + daemon_id + '.asok', '--default-log-to-file=false', '--default-log-to-stderr=true', ] - if args.uid != 0: - r = r + ['--setuser', str(args.uid)] - if args.gid != 0: - r = r + ['--setgroup', str(args.gid)] + r += ['--setuser', str(uid)] + r += ['--setgroup', str(gid)] return r - -def create_daemon_dirs(fsid, daemon_type, daemon_id, +def create_daemon_dirs(fsid, daemon_type, daemon_id, uid, gid, config=None, keyring=None): data_dir = get_data_dir(args.data_dir, fsid, daemon_type, daemon_id) makedirs(data_dir) - if args.uid and args.gid: - os.chown(data_dir, args.uid, args.gid) + os.chown(data_dir, uid, gid) log_dir = get_log_dir(args.log_dir, fsid) makedirs(log_dir) - if args.uid and args.gid: - os.chown(log_dir, args.uid, args.gid) + os.chown(log_dir, uid, gid) if config: with open(data_dir + '/conf', 'w') as f: f.write(config) - if args.uid and args.gid: - os.fchown(f.fileno(), args.uid, args.gid) + os.fchown(f.fileno(), uid, gid) if keyring: with open(data_dir + '/keyring', 'w') as f: f.write(keyring) os.fchmod(f.fileno(), 0o600) - if args.uid and args.gid: - os.fchown(f.fileno(), args.uid, args.gid) + os.fchown(f.fileno(), uid, gid) def get_config_and_keyring(): if args.conf_and_key: @@ -102,7 +93,7 @@ def get_config_and_keyring(): config = f.read() return (config, keyring) -def get_container(fsid, daemon_type, daemon_id): +def get_container(fsid, daemon_type, daemon_id, uid, gid): data_dir = get_data_dir(args.data_dir, fsid, daemon_type, daemon_id) log_dir = get_log_dir(args.log_dir, fsid) @@ -115,7 +106,7 @@ def get_container(fsid, daemon_type, daemon_id): args=['-i', daemon_id, '-c', cdata_dir + '/conf', '-f', # foreground - ] + extra_args + get_daemon_args(fsid, daemon_type, daemon_id), + ] + extra_args + get_daemon_args(fsid, daemon_type, daemon_id, uid, gid), volume_mounts={ log_dir: '/var/log/ceph:z', data_dir: cdata_dir + ':z', @@ -124,10 +115,21 @@ def get_container(fsid, daemon_type, daemon_id): cname='ceph-%s-%s.%s' % (fsid, daemon_type, daemon_id), ) -def deploy_daemon(fsid, daemon_type, daemon_id, c, config=None, keyring=None): +def extract_uid_gid(): + out = CephContainer( + image=args.image, + entrypoint='grep', + args=['ceph', '/etc/passwd'], + ).run().decode('utf-8') + (uid, gid) = out.split(':')[2:4] + return (int(uid), int(gid)) + +def deploy_daemon(fsid, daemon_type, daemon_id, c, uid, gid, + config=None, keyring=None): # dirs, conf, keyring create_daemon_dirs( fsid, daemon_type, daemon_id, + uid, gid, config, keyring) # cmd @@ -278,6 +280,8 @@ def command_bootstrap(): mgr_id = args.mgr_id or get_hostname() logging.info('cluster fsid: %s' % fsid) + (uid, gid) = extract_uid_gid() + # create some initial keys mon_key = CephContainer( image=args.image, @@ -314,8 +318,7 @@ def command_bootstrap(): # tmp keyring file tmp_keyring = tempfile.NamedTemporaryFile(mode='w') os.fchmod(tmp_keyring.fileno(), 0o600) - if args.uid and args.gid: - os.fchown(tmp_keyring.fileno(), args.uid, args.gid) + os.fchown(tmp_keyring.fileno(), uid, gid) tmp_keyring.write(keyring) tmp_keyring.flush() @@ -345,7 +348,7 @@ def command_bootstrap(): ).run() # create mon - create_daemon_dirs(fsid, 'mon', mon_id) + create_daemon_dirs(fsid, 'mon', mon_id, uid, gid) mon_dir = get_data_dir(args.data_dir, fsid, 'mon', mon_id) log_dir = get_log_dir(args.log_dir, fsid) out = CephContainer( @@ -358,7 +361,7 @@ def command_bootstrap(): '--monmap', '/tmp/monmap', '--keyring', '/tmp/keyring', '--debug-mon', '20', - ] + get_daemon_args(fsid, 'mon', mon_id), + ] + get_daemon_args(fsid, 'mon', mon_id, uid, gid), volume_mounts={ log_dir: '/var/log/ceph:z', mon_dir: '/var/lib/ceph/mon/ceph-%s:z' % (mon_id), @@ -370,13 +373,13 @@ def command_bootstrap(): with open(mon_dir + '/conf', 'w') as f: f.write(config) - mon_c = get_container(fsid, 'mon', mon_id) - deploy_daemon(fsid, 'mon', mon_id, mon_c) + mon_c = get_container(fsid, 'mon', mon_id, uid, gid) + deploy_daemon(fsid, 'mon', mon_id, mon_c, uid, gid) # create mgr mgr_keyring = '[mgr.%s]\n\tkey = %s\n' % (mgr_id, mgr_key) - mgr_c = get_container(fsid, 'mgr', mgr_id) - deploy_daemon(fsid, 'mgr', mgr_id, mgr_c, config, mgr_keyring) + mgr_c = get_container(fsid, 'mgr', mgr_id, uid, gid) + deploy_daemon(fsid, 'mgr', mgr_id, mgr_c, uid, gid, config, mgr_keyring) # output files if args.output_keyring: @@ -399,15 +402,17 @@ def command_deploy(): if daemon_type not in ['mon', 'mgr', 'mds', 'osd', 'rgw']: raise RuntimeError('daemon type %s not recognized' % daemon_type) (config, keyring) = get_config_and_keyring() - - c = get_container(args.fsid, daemon_type, daemon_id) - deploy_daemon(args.fsid, daemon_type, daemon_id, c, config, keyring) + (uid, gid) = extract_uid_gid() + c = get_container(args.fsid, daemon_type, daemon_id, uid, gid) + deploy_daemon(args.fsid, daemon_type, daemon_id, c, uid, gid, + config, keyring) ################################## def command_run(): (daemon_type, daemon_id) = args.name.split('.') - c = get_container(args.fsid, daemon_type, daemon_id) + (uid, gid) = extract_uid_gid() + c = get_container(args.fsid, daemon_type, daemon_id, uid, gid) c.run() @@ -460,14 +465,6 @@ parser.add_argument( '--image', default=DEFAULT_IMAGE, help='container image') -parser.add_argument( - '--uid', - default=CEPH_USER_UID, - help='UID to use for new folders/files') -parser.add_argument( - '--gid', - default=CEPH_USER_GID, - help='GID to use for new folders/files') parser.add_argument( '--conf', '-c', help='ceph conf file to incorporate') -- 2.39.5