Ottomata has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/153706

Change subject: Add script and class to manage HDFS user directories
......................................................................

Add script and class to manage HDFS user directories

This will allow automatic creation of HDFS user directories
based on posix group membership.

Change-Id: I7208dc722a3ccf7a6af884471b212a467191602b
---
A files/hadoop/manage_hdfs_user_directories.sh
A manifests/hadoop/users.pp
2 files changed, 157 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet/cdh 
refs/changes/06/153706/1

diff --git a/files/hadoop/manage_hdfs_user_directories.sh 
b/files/hadoop/manage_hdfs_user_directories.sh
new file mode 100755
index 0000000..796b207
--- /dev/null
+++ b/files/hadoop/manage_hdfs_user_directories.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+
+set -e
+
+usage_message="Usage $(basename "$0") [--dry-run|-n] [-v|--verbose] <group>"
+
+
+help_message="${usage_message}
+
+Manages HDFS user directories.
+
+This will ensure that users in the specified group all have
+HDFS user (home) directories at hdfs:///user/<username>.
+This script must be run by the HDFS super user 'hdfs'.
+
+Options:
+  -n, --dry-run        Don't actually create directories, just
+                       output what would have been done.  If
+                       There are changes needed, this script
+                       will exit 3.
+  -v, --verbose        Print out hdfs commands that would be run.
+"
+
+dry_run='false'
+verbose='false'
+changes_needed='false'
+
+
+if [ $(whoami) != 'hdfs' ]; then
+    echo "Error: $(basename "$0") must be run as the 'hdfs' user." >&2
+    echo "${usage_message}"
+    exit 1
+fi
+
+
+function validate_group {
+    local group="${1}"
+
+    set +e
+    if [ -z "${group}" ]; then
+        echo "Error: Must specify group" >&2
+        echo "${usage_message}"
+        exit 1
+    fi
+
+    /usr/bin/getent group "${group}" > /dev/null
+    if [ $? -ne 0 ]; then
+        echo "Error: Invalid group.  '${group}' does not exist." >&2
+        echo "${usage_message}"
+        exit 1
+    fi
+
+    set -e
+}
+
+function create_hdfs_user_directory {
+    local user="${1}"
+
+    command="hdfs dfs -mkdir /user/${user} && hdfs dfs -chown ${user}:${user} 
/user/${user}"
+
+    if [ "${verbose}" == 'true' ]; then
+        echo "${command}"
+    fi
+
+    if [ "${dry_run}" == 'false' ]; then
+        $command
+    fi
+}
+
+
+# Parse CLI args
+while [ $# != 0 ]; do
+
+    case "$1" in
+    -n|--dry-run)
+        dry_run='true'
+        ;;
+    -v|--verbose)
+        verbose='true'
+        ;;
+    -h|--help)
+        echo "${help_message}"
+        exit 0
+        ;;
+    *)
+        if [ $# -gt 1 ]; then
+            exit_unknown "Invalid argument '${1}'"
+        else
+            group="${1}"
+        fi
+        ;;
+    esac
+    shift
+done
+
+
+
+# Make sure group was specified and exists.
+validate_group "${group}"
+
+# Get a list of usernames in $group
+group_members=$(/usr/bin/getent group "${group}" | /usr/bin/awk -F ':' '{print 
$NF}' | tr ',' ' ')
+
+# Get a list of existant HDFS user directories.
+hdfs_user_directories=$(/usr/bin/hdfs dfs -ls /user | /usr/bin/awk '{print 
$NF}' | /bin/sed 's@/user/@@g')
+
+
+if [ "${dry_run}" == 'true' -a "${verbose}" == 'true' ]; then
+    echo "--dry-run mode on; not actually doing anything."
+fi
+
+# For each user in $group, make sure that
+# user has an hdfs user directory.  If they don't,
+# go ahead and create it now
+for user in $group_members; do
+    (echo "${hdfs_user_directories}" | grep -q "${user}") ||
+        (create_hdfs_user_directory "${user}"; changes_needed='true')
+done
+
+if [ "${changes_needed}" == 'true' -a "${dry_run}" == 'true' ]; then
+    if [ "${verbose}" == 'true' ];
+        echo "--dry-run mode on and there were needed changes.  Exiting 3."
+    fi
+    exit 3
+fi
diff --git a/manifests/hadoop/users.pp b/manifests/hadoop/users.pp
new file mode 100644
index 0000000..97edd08
--- /dev/null
+++ b/manifests/hadoop/users.pp
@@ -0,0 +1,32 @@
+# == Class cdh::hadoop::users
+# Ensures that all users in the posix group $group
+# have HDFS user directories at /user/<username>
+#
+# == Parameters
+# $group        - Group name in which all users should have
+#                 access to Hadoop.  Default: hadoop
+#
+# == Usage
+# The following will ensure that any users in the
+# posix group 'my-analytics-group' have HDFS user
+# directories.
+#
+#    class { 'cdh::hadoop::users':
+#        group => 'my-analytics-group',
+#    }
+#
+class cdh::hadoop::users($group = 'hadoop') {
+    Class['cdh::hadoop'] -> Class['cdh::hadoop::users']
+
+    file { '/usr/local/bin/manage_hdfs_user_directories.sh':
+        source => 
'puppet://modules/cdh/hadoop/manage_hdfs_user_directories.sh',
+        mode   => '0755',
+    }
+
+    exec { 'manage_hdfs_user_directories':
+        command   => "/usr/local/bin/manage_hdfs_user_directories.sh --verbose 
${group}",
+        unless    => "/usr/local/bin/manage_hdfs_user_directories.sh --dry-run 
${group}"
+        user      => 'hdfs',
+        logoutput => true,
+    }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/153706
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7208dc722a3ccf7a6af884471b212a467191602b
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet/cdh
Gerrit-Branch: master
Gerrit-Owner: Ottomata <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to