Skip to content

Instantly share code, notes, and snippets.

@mshafiee
Last active May 11, 2022 12:00
Show Gist options
  • Save mshafiee/2296f256ff9f2d0d5b575c0e501d1cc3 to your computer and use it in GitHub Desktop.
Save mshafiee/2296f256ff9f2d0d5b575c0e501d1cc3 to your computer and use it in GitHub Desktop.
Join Ubuntu 20.04.4 to Active Directory Domain
#!/bin/bash
JDC_ORG_UNIT=""
JDC_ORG_ENV=""
JDC_DOMAIN_NAME=mydomain.com
JDC_AD_DC1_IP=192.168.240.11
JDC_AD_DC2_IP=192.168.240.12
JDC_AD_DC1_NAME=dc1-inf-ad-ds1.mydomain.com
JDC_AD_DC2_NAME=dc1-inf-ad-ds2.mydomain.com
JDC_HOST_NAME=$(hostname | awk -F'.' '{print $1}').$JDC_DOMAIN_NAME
JDC_GROUP_PREFIX="os"
JDC_ORG_LOGIN="login"
JDC_ORG_SUDOER="sudoer"
JDC_GLOBAL_ORG_UNIT="global"
JDC_JOIN_USER="dc.join"
JDC_NETPLAN_CONFIG_FILE=/etc/netplan/00-installer-config.yaml
JDC_PAM_FILE=/etc/pam.d/common-session
JDC_SSSD_FILE=/etc/sssd/sssd.conf
JDC_SUDOER_FILE=/etc/sudoers.d/domain_admins
JDC_NTP_FILE="/etc/ntp.conf"
function setup_ntp_client() {
echo "-------------------------------"
echo " Setup NTP Client"
echo "-------------------------------"
timedatectl set-ntp off
sudo apt -y install ntp
if [ $? == 100 ]; then
echo "Running Failed! Error in 'apt -y install' command"
exit 1
fi
JDC_NTP_SERVER_CONFIG_1="server $JDC_AD_DC1_NAME prefer iburst"
JDC_NTP_SERVER_CONFIG_2="server $JDC_AD_DC2_NAME prefer iburst"
grep -qxF "$JDC_NTP_SERVER_CONFIG_1" $JDC_NTP_FILE || (cp $JDC_NTP_FILE $JDC_NTP_FILE.bk_`date +%Y%m%d%H%M` && echo -e "# AD-DC NTP Server config\n$JDC_NTP_SERVER_CONFIG_1" >> $JDC_NTP_FILE)
grep -qxF "$JDC_NTP_SERVER_CONFIG_2" $JDC_NTP_FILE || (cp $JDC_NTP_FILE $JDC_NTP_FILE.bk_`date +%Y%m%d%H%M` && echo -e "$JDC_NTP_SERVER_CONFIG_2" >> $JDC_NTP_FILE)
systemctl restart ntp
ntpq -p
echo "---"
echo "Time difference between this machine and the $JDC_AD_DC1_NAME"
ntpdate -q $JDC_AD_DC1_NAME
}
function join_computer_to_domain() {
echo "------------------------------------------------------"
echo " Join Computer to Active Directory Domain Controler"
echo "------------------------------------------------------"
echo "Selected ORG_UNIT is $JDC_ORG_UNIT and ORG_ENV is $JDC_ORG_ENV"
hostnamectl set-hostname $JDC_HOST_NAME
echo $(hostname)
snap install yq
if [[ $? != 0 ]]; then
echo "Error in 'snap install yq' command"
exit 1
fi
JDC_NETPLAN_CONFIG_BACKUP_FILE=$JDC_NETPLAN_CONFIG_FILE+`date +%Y%m%d%H%M`
cp $JDC_NETPLAN_CONFIG_FILE $JDC_NETPLAN_CONFIG_BACKUP_FILE
JDC_AD_DC1_IP=$JDC_AD_DC1_IP JDC_AD_DC2_IP=$JDC_AD_DC2_IP JDC_DOMAIN_NAME=$JDC_DOMAIN_NAME JDC_NETPLAN_CONFIG_FILE=$JDC_NETPLAN_CONFIG_FILE JDC_NETPLAN_CONFIG_BACKUP_FILE=$JDC_NETPLAN_CONFIG_BACKUP_FILE bash -c 'cat $JDC_NETPLAN_CONFIG_BACKUP_FILE | yq -e ".network.ethernets.ens160.nameservers.addresses[0]=env(JDC_AD_DC1_IP) | .network.ethernets.ens160.nameservers.addresses[1]=env(JDC_AD_DC2_IP) | .network.ethernets.ens160.nameservers.search[0]=env(JDC_DOMAIN_NAME)" | tee $JDC_NETPLAN_CONFIG_FILE'
netplan try
if [[ $? != 0 ]]; then
echo "There is some errors in netplan config"
exit 1
fi
netplan apply
nslookup $JDC_DOMAIN_NAME | grep -q "$JDC_AD_DC1_IP" 2>&1
if [[ $? != 0 ]]; then
echo "Running Failed! $JDC_AD_DC1_IP is not set as one of DNS servers, or you don't have network access to $JDC_AD_DC1_IP"
exit 1
fi
nslookup $JDC_DOMAIN_NAME | grep -q "$JDC_AD_DC2_IP" 2>&1
if [[ $? != 0 ]]; then
echo "Running Failed! $JDC_AD_DC2_IP is not set as one of DNS servers, or you don't have network access to $JDC_AD_DC2_IP"
exit 1
fi
apt -y update
if [ $? == 100 ]; then
echo "Running Failed! Error in 'apt -y update' command"
exit 1
fi
apt -y install realmd libnss-sss libpam-sss sssd sssd-tools adcli samba-common-bin oddjob oddjob-mkhomedir packagekit
if [ $? == 100 ]; then
echo "Running Failed! Error in 'apt -y install' command"
exit 1
fi
realm discover $JDC_DOMAIN_NAME
if [ $? == 1 ]; then
echo "Running Failed! Error in finding $JDC_DOMAIN_NAME' realm!"
exit 1
fi
JDC_JOIN_OU="OU=$JDC_ORG_UNIT,DC=superpay,DC=tech"
realm join --computer-ou=$JDC_JOIN_OU --user=$JDC_JOIN_USER --os-name=$(lsb_release -si) --os-version=$(lsb_release -sr) $JDC_DOMAIN_NAME
if [ $? == 1 ]; then
echo "Running Failed! Error in joining to $JDC_DOMAIN_NAME' realm!"
exit 1
fi
id $JDC_JOIN_USER@$JDC_DOMAIN_NAME
if [ $? == 1 ]; then
echo "Running Failed! The system hasn't join to $JDC_DOMAIN_NAME' realm!"
exit 1
fi
JDC_MKHOMEDIR_IN_PAM_FILE="session optional pam_mkhomedir.so skel=/etc/skel umask=077"
grep -qxF "$JDC_MKHOMEDIR_IN_PAM_FILE" $JDC_PAM_FILE || (cp $JDC_PAM_FILE $JDC_PAM_FILE.bk_`date +%Y%m%d%H%M` && echo -e "# Create home directory for domain users\n$JDC_MKHOMEDIR_IN_PAM_FILE" >> $JDC_PAM_FILE)
cp $JDC_SSSD_FILE $JDC_SSSD_FILE.bk_`date +%Y%m%d%H%M`
sed -i '/use_fully_qualified_names/c\use_fully_qualified_names = False' $JDC_SSSD_FILE
realm deny --all
realm permit Administrator@$JDC_DOMAIN_NAME
realm permit -g "$JDC_GROUP_PREFIX-$JDC_GLOBAL_ORG_UNIT-$JDC_ORG_ENV-$JDC_ORG_LOGIN"
realm permit -g "$JDC_GROUP_PREFIX-$JDC_ORG_UNIT-$JDC_ORG_ENV-$JDC_ORG_LOGIN"
realm list
if test -f "$JDC_SUDOER_FILE"; then
mv $JDC_SUDOER_FILE $JDC_SUDOER_FILE.bk_`date +%Y%m%d%H%M`
fi
echo -e "%$JDC_GROUP_PREFIX-$JDC_GLOBAL_ORG_UNIT-$JDC_ORG_ENV-$JDC_ORG_SUDOER ALL=(ALL) ALL" | tee -a $JDC_SUDOER_FILE
echo -e "%$JDC_GROUP_PREFIX-$JDC_ORG_UNIT-$JDC_ORG_ENV-$JDC_ORG_SUDOER ALL=(ALL) ALL" | tee -a $JDC_SUDOER_FILE
echo -e "Administrator ALL=(ALL) ALL" | tee -a $JDC_SUDOER_FILE
systemctl restart sshd.service
sleep 10;
systemctl restart sssd
}
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
clear='\e[0m'
##
# Color Functions
##
ColorGreen(){
echo -ne $green$1$clear
}
ColorBlue(){
echo -ne $blue$1$clear
}
menu_org_env(){
echo -ne "
Environment
$(ColorGreen '1)') PROD
$(ColorGreen '2)') UAT
$(ColorGreen '3)') DB
$(ColorGreen '4)') APP
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read a
case $a in
1) JDC_ORG_ENV="prod" ; join_computer_to_domain ; setup_ntp_client;;
2) JDC_ORG_ENV="uat" ; join_computer_to_domain ; setup_ntp_client;;
3) JDC_ORG_ENV="db" ; join_computer_to_domain ; setup_ntp_client;;
4) JDC_ORG_ENV="app" ; join_computer_to_domain ; setup_ntp_client;;
0) exit 0 ;;
*) echo -e $red"Wrong option."$clear; WrongCommand;;
esac
}
menu_org_unit(){
echo -ne "
Organizational Unit
$(ColorGreen '1)') SPP
$(ColorGreen '2)') HDR
$(ColorGreen '3)') MHF
$(ColorGreen '4)') MZH
$(ColorGreen '5)') SPT
$(ColorGreen '6)') INF
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read a
case $a in
1) JDC_ORG_UNIT="spp" ; menu_org_env ;;
2) JDC_ORG_UNIT="hdr" ; menu_org_env ;;
3) JDC_ORG_UNIT="mhf" ; menu_org_env ;;
4) JDC_ORG_UNIT="mzh" ; menu_org_env ;;
5) JDC_ORG_UNIT="spt" ; menu_org_env ;;
6) JDC_ORG_UNIT="inf" ; menu_org_env ;;
0) exit 0 ;;
*) echo -e $red"Wrong option."$clear; WrongCommand;;
esac
}
# Call the menuOrgUnit function
menu_org_unit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment