]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-daemon: autodetect uid/gid from container image
authorSage Weil <sage@redhat.com>
Fri, 27 Sep 2019 14:23:38 +0000 (09:23 -0500)
committerSage Weil <sage@redhat.com>
Wed, 2 Oct 2019 12:11:12 +0000 (07:11 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/ceph-daemon

index 7f119ce9b9ad991d341d1669718ed14d2ac2c9c3..a43ad3be3b7d25ab890806f00598a7aa68cc598d 100755 (executable)
@@ -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')