рд╢реЗрд▓рд┐рдмрд▓ рдореЗрдВ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрд┐рд╕реА рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдЖрдкрдХреЛ RHEL рдФрд░ AIX рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд sudoers рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред



рдЦреИрд░, рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЖрдк рдПрдВрд╕рд┐рдмрд▓ рдХреА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреИрд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ - рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЖрджрд░реНрд╢ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛) рд╡рд┐рд╡рд░рдг рдФрд░ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рдмрд┐рдирд╛ред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдВ:

#!/bin/sh # Desc: Distribute unified copy of /etc/sudoers # # $Id: $ #set -x export ODMDIR=/etc/repos # # perform any cleanup actions we need to do, and then exit with the # passed status/return code # clean_exit() { cd / test -f "$tmpfile" && rm $tmpfile exit $1 } #Set variables PROG=`basename $0` PLAT=`uname -s|awk '{print $1}'` HOSTNAME=`uname -n | awk -F. '{print $1}'` HOSTPFX=$(echo $HOSTNAME |cut -c 1-2) NFSserver="nfs-server" NFSdir="/NFS/AIXSOFT_NFS" MOUNTPT="/mnt.$$" MAILTO="unix@company.com" DSTRING=$(date +%Y%m%d%H%M) LOGFILE="/tmp/${PROG}.dist_sudoers.${DSTRING}.log" BKUPFILE=/etc/sudoers.${DSTRING} SRCFILE=${MOUNTPT}/skel/sudoers-uni MD5FILE="/.sudoers.md5" echo "Starting ${PROG} on ${HOSTNAME}" >> ${LOGFILE} 2>&1 # Make sure we run as root runas=`id | awk -F'(' '{print $1}' | awk -F'=' '{print $2}'` if [ $runas -ne 0 ] ; then echo "$PROG: you must be root to run this script." >> ${LOGFILE} 2>&1 exit 1 fi case "$PLAT" in SunOS) export PINGP=" -t 7 $NFSserver " export MOUNTP=" -F nfs -o vers=3,soft " export PATH="/usr/sbin:/usr/bin" echo "SunOS" >> ${LOGFILE} 2>&1 exit 0 ;; AIX) export PINGP=" -T 7 $NFSserver 2 2" export MOUNTP=" -o vers=3,bsy,soft " export PATH="/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java5/jre/bin:/usr/java5/bin" printf "Continuing on AIX...\n\n" >> ${LOGFILE} 2>&1 ;; Linux) export PINGP=" -t 7 -c 2 $NFSserver" export MOUNTP=" -o nfsvers=3,soft " export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" printf "Continuing on Linux...\n\n" >> ${LOGFILE} 2>&1 ;; *) echo "Unsupported Platform." >> ${LOGFILE} 2>&1 exit 1 esac ## ## Exclude Lawson Hosts ## if [ ${HOSTPFX} = "la" ] then echo "Exiting Lawson host ${HOSTNAME} with no changes." >> ${LOGFILE} 2>&1 exit 0 fi ## ## * NFS Mount Section * ## ## Check to make sure NFS host is up printf "Current PATH is..." >> ${LOGFILE} 2>&1 echo $PATH >> $LOGFILE 2>&1 ping $PINGP >> $LOGFILE 2>&1 if [ $? -ne 0 ]; then echo " NFS server is DOWN ... ABORTING SCRIPT ... Please check server..." >> $LOGFILE echo "$PROG failed on $HOSTNAME ... NFS server is DOWN ... ABORTING SCRIPT ... Please check server ... " | mailx -s "$PROG Failed on $HOSTNAME" $MAILTO exit 1 else echo " NFS server is UP ... We will continue..." >> $LOGFILE fi ## ## Mount NFS share to HOSTNAME. We do this using a soft mount in case it is lost during a backup ## mkdir $MOUNTPT mount $MOUNTP $NFSserver:${NFSdir} $MOUNTPT >> $LOGFILE 2>&1 ## ## Check to make sure mount command returned 0. If it did not odds are something else is mounted on /mnt.$$ ## if [ $? -ne 0 ]; then echo " Mount command did not work ... Please check server ... Odds are something is mounted on $MOUNTPT ..." >> $LOGFILE echo " $PROG failed on $HOSTNAME ... Mount command did not work ... Please check server ... Odds are something is mounted on $MOUNTPT ..." | mailx -s "$PROG Failed on $HOSTNAME" $MAILTO exit 1 else echo " Mount command returned a good status which means $MOUNPT was free for us to use ... We will now continue ..." >> $LOGFILE fi ## ## Now check to see if the mount worked ## if [ ! -f ${SRCFILE} ]; then echo " File ${SRCFILE} is missing... Maybe NFS mount did NOT WORK ... Please check server ..." >> $LOGFILE echo " $PROG failed on $HOSTNAME ... File ${SRCFILE} is missing... Maybe NFS mount did NOT WORK ... Please check server ..." | mailx -s "$PROG Failed on $HOSTNAME" $MA ILTO umount -f $MOUNTPT >> $LOGFILE rmdir $MOUNTPT >> $LOGFILE exit 1 else echo " NFS mount worked we are going to continue ..." >> $LOGFILE fi ## ## * Main Section * ## if [ ! -f ${BKUPFILE} ] then cp -p /etc/sudoers ${BKUPFILE} else echo "Backup file already exists$" >> ${LOGFILE} 2>&1 exit 1 fi if [ -f "$SRCFILE" ] then echo "Copying in new sudoers file from $SRCFILE." >> ${LOGFILE} 2>&1 cp -p $SRCFILE /etc/sudoers chmod 440 /etc/sudoers else echo "Source file not found" >> ${LOGFILE} 2>&1 exit 1 fi echo >> ${LOGFILE} 2>&1 visudo -c |tee -a ${LOGFILE} if [ $? -ne 0 ] then echo "sudoers syntax error on $HOSTNAME." >> ${LOGFILE} 2>&1 mailx -s "${PROG}: sudoers syntax error on $HOSTNAME" "$MAILTO" << EOF Syntax error /etc/sudoers on $HOSTNAME. Reverting changes Please investigate. EOF echo "Reverting changes." >> ${LOGFILE} 2>&1 cp -p ${BKUPFILE} /etc/sudoers else # # Update checksum file # grep -v '/etc/sudoers' ${MD5FILE} > ${MD5FILE}.tmp csum /etc/sudoers >> ${MD5FILE}.tmp mv ${MD5FILE}.tmp ${MD5FILE} chmod 600 ${MD5FILE} fi echo >> ${LOGFILE} 2>&1 if [ "${HOSTPFX}" = "hd" ] then printf "\nAppending #includedir /etc/sudoers.d at end of file.\n" >> ${LOGFILE} 2>&1 echo "" >> /etc/sudoers echo "## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)" >> /etc/sudoers echo "#includedir /etc/sudoers.d" >> /etc/sudoers fi ## ## * NFS Un-mount Section * ## ## ## Unmount /mnt.$$ directory ## umount ${MOUNTPT} >> $LOGFILE 2>&1 if [ -d ${MOUNTPT} ]; then rmdir ${MOUNTPT} >> $LOGFILE 2>&1 fi ## ## Make sure that /mnt.$$ got unmounted ## if [ -f ${SRCFILE} ]; then echo " The umount command failed to unmount ${MOUNTPT} ... We will not force the unmount ..." >> $LOGFILE umount -f ${MOUNTPT} >> $LOGFILE 2>&1 if [ -d ${MOUNTPT} ]; then rmdir ${MOUNTPT} >> $LOGFILE 2>&1 fi else echo " $MOUNTPT was unmounted ... There is no need for user intervention on $HOSTNAME ..." >> $LOGFILE fi # # as always, exit cleanly # clean_exit 0 

рдХреЛрдб рдХреА 212 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ sudoers рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЛрдИ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЪрд▓рддреА рд╣реИ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪреЗрдХрд╕рдо рдЪреЗрдХ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реЛрд▓рд╛рд░рд┐рд╕ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛ред

рдЖрдЗрдП рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реВрдЯ рдореЗрдВ рдлрд╛рдЗрд▓ рдХреЛ рдлрд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдореЗрдВ рдПрдирдПрдлрдПрд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдХреЙрдкреА рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдФрд░ рдмреИрдХрдЕрдк рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдмреИрдХрдЕрдк рд▓реЗрдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЧрдВрддрд╡реНрдп рдмрд┐рдВрджреБ рдкрд░ рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд╛рд░реНрдп, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдБ рд╕рдВрдЧрдд рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:



рднреВрдорд┐рдХрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ (рдкреНрд▓реЗрдмреБрдХ), sudoers.yml , рдХреА рдПрдХ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

---
##
# Role playbook
##
- hosts: all
roles:
- sudoers
...

рднреВрдорд┐рдХрд╛ рдЪрд░ var / main.yml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЪреЗрдХрд╕рдо рдлрд╝рд╛рдЗрд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ / рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрд╕рди рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ sudoers.d рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЗрд╡рд▓ HD рд╣реЛрд╕реНрдЯреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдБ var / main.yml рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рджреА рдЧрдИ рд╣реИ :

---
MD5FILE: /root/.sudoer.md5
EXCLUDE: la
INCLUDE: hd
...

рдпрджрд┐ рд╣рдо рдХреЙрдкреА рдФрд░ рд▓рд╛рдЗрдирдЗрдирдлрд╛рдЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреВрдорд┐рдХрд╛ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧреАред рдХреЙрдкреА рдореЙрдбреНрдпреВрд▓ рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рд▓рд╛рдЗрдирдЗрдирдлрд╛рдЗрд▓ рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ред рдЪреВрдБрдХрд┐ рдпрд╣ рднреВрдорд┐рдХрд╛ Ansible Tower рдкрд░ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ jinja2 рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдЗрдВрдбреЗрдВрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

#jinja2: lstrip_blocks: True, trim_blocks: True

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЯреНрд░рд┐рдо_рдмреНрд▓реЙрдХ (Ansible 2.4 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛) рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд▓рд╛рдЗрди рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

{% if ansible_hostname[0:2] == INCLUDE %}
#includedir /etc/sudoers.d
{% endif %}

рд╣рдо рд╢реЗрд▓ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг ({% if%}, {% endif%}) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣реЛрд╕реНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо рдЕрдХреНрд╖рд░ "HD" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрд╕рд┐рдмрд▓ рддрдереНрдпреЛрдВ рдФрд░ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ [0: 2] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореЗрдЬрдмрд╛рди рдирд╛рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдереНрдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдореЗрдВ "parhost" рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

---
##
# Parse hostnames to grab 1st 2 characters
##
- name: "Parse hostname's 1st 2 characters"
set_fact: parhost={{ ansible_hostname[0:2] }}

RHEL рд╕реНрдЯреЙрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдИ csum рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдХреЛ рдЪреЗрдХрд╕рдо рдХреЗ рд╕рд╛рде рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ AIX, Solaris рдФрд░ Linux рдкрд░ рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рднрд┐рдиреНрди рд╣реИрдВ, рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ AIX рдФрд░ RHEL рдкрд░ рд░реВрдЯ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

##
# Conditionally set name of checksum binary
##
- name: "set checksum binary"
set_fact:
csbin: "{{ 'cksum' if (ansible_distribution == 'RedHat') else 'csum' }}"

##
# Conditionally set name of root group
##
- name: "set system group"
set_fact:
sysgroup: "{{ 'root' if (ansible_distribution == 'RedHat') else 'sys' }}"

рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдо рдкреВрд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо "рд▓рд╛" рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

##
# Enclose in block so we can use parhost to exclude hosts
##
- block:

рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдорд╛рдиреНрдп рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдореЗрдЬрдмрд╛рди рдкрд░ рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирдИ sudoer рдлрд╝рд╛рдЗрд▓ рдХреА рд╡реИрдзрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

##
# Validate will prevent bad files, no need to revert
# Jinja2 template will add include line
##
- name: Ensure sudoers file
template:
src: sudoers.j2
dest: /etc/sudoers
owner: root
group: "{{ sysgroup }}"
mode: 0440
backup: yes
validate: /usr/sbin/visudo -cf %s
register: sudochg

рдпрджрд┐ рдХреЛрдИ рдирдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЪреЗрдХрд╕рдо рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБред рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг sudoers рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╛ рдпрджрд┐ рдЪреЗрдХрд╕рдо рдлрд╝рд╛рдЗрд▓ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЪреЗрдХрд╕рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд░рдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рднреА рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрд░реЛрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рджрд┐рдП рдЧрдП рд╢реЗрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

- name: sudoers checksum
shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp ; {{ csbin }} /etc/sudoers >> {{ MD5FILE }} ; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"
when: sudochg.changed or MD5STAT.exists == false

рдлрд╝рд╛рдЗрд▓ рдореЙрдбреНрдпреВрд▓ рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ:

- name: Ensure MD5FILE permissions
file:
path: "{{ MD5FILE }}"
owner: root
group: "{{ sysgroup }}"
mode: 0600
state: file

рдЪреВрдВрдХрд┐ рдмреИрдХрдЕрдк рдкреИрд░рд╛рдореАрдЯрд░ рдкрд┐рдЫрд▓реЗ рдмреИрдХрдЕрдк рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдмрдирд╛рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП "рд░рдЬрд┐рд╕реНрдЯрд░" рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ "stdout_lines" рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

##
# List and clean up backup files. Retain 3 copies.
##
- name: List /etc/sudoers.*~ files
shell: "ls -t /etc/sudoers*~ |tail -n +4"
register: LIST_SUDOERS
changed_when: false

- name: Cleanup /etc/sudoers.*~ files
file:
path: "{{ item }}"
state: absent
loop: "{{ LIST_SUDOERS.stdout_lines }}"
when: LIST_SUDOERS.stdout_lines != ""

рдмреНрд▓реЙрдХ рд╕рдорд╛рдкрди:

##
# This conditional restricts what hosts this block runs on
##
when: parhost != EXCLUDE
...

рдЗрдЪреНрдЫрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рдЕрдВрд╕рд┐рдмрд▓ рдЯреЙрд╡рд░ рдкрд░ рдЦреЗрд▓рдирд╛ рд╣реИред рдЕрдиреНрд╕рд┐рдмрд▓ рдЯреЙрд╡рд░ рдЕрд▓рд░реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдиреМрдХрд░реА рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдИрдореЗрд▓ рдХреЛ рд╕реНрд▓реИрдХ, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рд░реНрдЯ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднреВрдорд┐рдХрд╛ Ansible, Ansible Engine рдпрд╛ Ansible Tower рдореЗрдВ рдЪрд▓рддреА рд╣реИред

рдирддреАрдЬрддрди, рд╣рдордиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рдмрдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЖрджрд░реНрд╢ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдИ рдЬреЛ рд╕реВрдбрд░реНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИред SCM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рдмрдВрдзрди рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬреЗрдирдХрд┐рдВрд╕ рдпрд╛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдЖрдИ / рд╕реАрдбреА рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП Ansible рдХреЛрдб рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЖрдВрд╕рд┐рдмрд▓ рдЯреЙрд╡рд░ рдореЗрдВ рдСрдбрд┐рдЯрд░ рдХреА рднреВрдорд┐рдХрд╛ рдЖрдкрдХреЛ рд╕рдВрдЧрдардирд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдкреНрд░рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдЪреЗрдХрд╕рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрд╣рд▓реЗ рдЕрдкрдиреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗрд╡рд╛ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╕реВрдбреЛрд░реНрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдЕрдиреНрд╕рд┐рдмрд▓ рд╡реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

тЖТ рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ GitHub рд╕реЗ рднреВрдорд┐рдХрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/hi433792/


All Articles