256 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/sh
 | |
| # -*-mode: sh; tab-width: 8; coding: utf-8-unix -*-
 | |
| 
 | |
| [ ! -f /usr/local/etc/testforge/testforge.bash ] || \
 | |
|   . /usr/local/etc/testforge/testforge.bash || exit 1
 | |
| . /usr/local/bin/usr_local_tput.bash || exit 2
 | |
| 
 | |
| PYVER=3
 | |
| PYTHON_MINOR=3.11 # $( python$PYVER --version 2>&1| sed -e 's@^.* @@' -e 's@\.[0-9]*$@@' )
 | |
| #sudo chmod 1777 /tmp/.ansible /tmp/.ansible/tmp
 | |
| 
 | |
| PYTHON_EXE=/usr/local/bin/python${PYVER}.sh
 | |
| # old 2 jinja2
 | |
| export PYTHONPATH=/usr/local/lib/python3.11/site-packages
 | |
| 
 | |
| export TESTFORGE_ANSIBLE_DIR=$PWD
 | |
| export TMPDIR=/mnt/tmp/Pentoo
 | |
| export TMP=/mnt/tmp/Pentoo
 | |
| # subtle problem with MFLAGS in a calling make getting picked up by an inferior make
 | |
| export MFLAGS=""
 | |
| WD=$PWD
 | |
| 
 | |
| skip=
 | |
| tags='untagged'
 | |
| check=0
 | |
| connection=
 | |
| verbose=1
 | |
| debug=
 | |
| diff=0
 | |
| become=-1
 | |
| limit=''
 | |
| inventory=hosts.yml
 | |
| step=0
 | |
| timeout=60
 | |
| gather_timeout=120
 | |
| start=""
 | |
| list_tags=0
 | |
| list_tasks=0
 | |
| # unused
 | |
| user=""
 | |
| group=""
 | |
| home=""
 | |
| also=""
 | |
| #
 | |
| verbose=2
 | |
| limit=$1
 | |
| roles="proxy ansible-gentoo_install toxcore"
 | |
| [ -z "$limit" ] && BOX_HOST=localhost || BOX_HOST=$limit
 | |
| limit=$BOX_HOST
 | |
| 
 | |
| . $PWD/ansible_local.args
 | |
| 
 | |
| # --flush-cache
 | |
| if [ $verbose -eq 1 ] ; then
 | |
|     LARGS="-v"
 | |
| elif [ $verbose -eq 2 ] ; then
 | |
|     LARGS="-vv"
 | |
| elif [ $verbose -eq 3 ] ; then
 | |
|     LARGS="-vvv"
 | |
| elif [ $verbose -eq 4 ] ; then
 | |
|     LARGS="-vvvv"
 | |
| else
 | |
|     LARGS=""    
 | |
| fi
 | |
| # https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables
 | |
| # https://github.blog/2018-02-01-crypto-removal-notice/
 | |
| # https://stackoverflow.com/questions/48938019/git-pull-push-unable-to-access-https-ssl-routines-seem-to-be-down
 | |
| if [ $verbose -ge 3 ] ; then
 | |
|     export GIT_TRACE=1
 | |
|   fi
 | |
| if [ $verbose -ge 4 ] ; then
 | |
|     export GIT_CURL_VERBOSE=1
 | |
|   fi
 | |
| 
 | |
| export ANSIBLE_CONFIG=/o/var/local/src/play_tox/ansible.cfg
 | |
| 
 | |
| #? ANSIBLE_TRANSPORT=chroot PYTHONUNBUFFERED=1
 | |
| if [ -z "$debug" ] ; then
 | |
|     EXE="$PYTHON_EXE /usr/local/bin/ansible-playbook"    
 | |
|   elif [ $debug = debug -o $debug = ansible ] ; then
 | |
|     export ANSIBLE_KEEP_REMOTE_FILES=1
 | |
|     export ANSIBLE_STRATEGY=debug
 | |
|     EXE="$PYTHON_EXE /usr/local/bin/ansible-playbook"
 | |
|   elif [ $debug = trepan ] ; then
 | |
|     export ANSIBLE_KEEP_REMOTE_FILES=1
 | |
|     EXE="/var/local/bin/trepan${PYVER}2.bash /usr/local/bin/ansible-playbook"
 | |
|   elif [ $debug = trepan2c ] ; then
 | |
|     export ANSIBLE_KEEP_REMOTE_FILES=1
 | |
|     EXE="/var/local/bin/trepan${PYVER}c2.bash /usr/local/bin/ansible-playbook"
 | |
|   # coverage
 | |
|   elif [ $debug != 0 ] ; then
 | |
|     export ANSIBLE_KEEP_REMOTE_FILES=1
 | |
|     export _ANSIBLE_TREPAN_PORT=$debug
 | |
|     EXE="$PYTHON_EXE /usr/local/bin/ansible-playbook"
 | |
|   fi
 | |
| 
 | |
| LARGS="$LARGS -c $connection "
 | |
| if [ $become -eq -1 ] ; then
 | |
|     [ $connection = chroot ] && become=0 || become=1
 | |
| fi
 | |
| [ $become -eq 0 ] || LARGS="$LARGS -b"
 | |
| [ $check -eq 0 ] || LARGS="$LARGS --check"
 | |
| [ $diff -eq 0 ] || LARGS="$LARGS -D"
 | |
| [ $step -eq 0 ] || LARGS="$LARGS --step"
 | |
| [ $list_tags -eq 0 ] || LARGS="$LARGS --list-tags"
 | |
| [ $list_tasks -eq 0 ] || LARGS="$LARGS --list-tasks"
 | |
| [ -n "$skip" ] && LARGS="$LARGS --skip-tags=$skip"
 | |
| [ -n "$tags" ] && LARGS="$LARGS --tags=$tags"
 | |
| [ -n "$start" ] && LARGS="$LARGS -start-at-task=\"$start\""
 | |
| [ -n "$inventory" ] && LARGS="$LARGS --inventory=$inventory"
 | |
| [ -n "$limit" ] && LARGS="$LARGS --limit=$limit"
 | |
| #  --flush-cache
 | |
| df | grep -q /home$ && [ -n "$RUN_QERC_USERFILE" ] && [ -f "$RUN_QERC_USERFILE" ] && \
 | |
| LARGS="$LARGS -e $RUN_QERC_USERFILE" && ls -l "$RUN_QERC_USERFILE"
 | |
| #    LARGS="$LARGS --ask-vault-pass" && ls -l "$RUN_QERC_USERFILE"
 | |
| 
 | |
| log_name=`echo $roles|sed -e 's/ /_/g'`
 | |
| [ -z "$log_name" ] && log_name=ansible
 | |
| [ "$tags" = untagged ]  | log_name=${log_name}-${tags}
 | |
| date=`date +%Y/%m/%d`
 | |
| log_relpath=var/tmp/$date/$BOX_HOST/$log_name.log
 | |
| grep -q "log_path = ${log_relpath}@"  ansible.cfg || \
 | |
|     sed -e "s@^log_path = .*@log_path = ${log_relpath}@" -i ansible.cfg
 | |
| ANSIBLE_RUN_LOG=$PWD/$log_relpath
 | |
| 
 | |
| EXTRA_VARS="{\"ANSIBLE_RUN_LOG\": $ANSIBLE_RUN_LOG"
 | |
| 
 | |
| if [ -d "$PLAY_PIP_CACHE" ] ; then
 | |
|     EXTRA_VARS="$EXTRA_VARS, \"PLAY_PIP_CACHE\": \"$PLAY_PIP_CACHE\""    
 | |
| fi
 | |
| if [ -f "$PLAY_CA_CERT" ] ; then
 | |
|     EXTRA_VARS="$EXTRA_VARS, \"PLAY_CA_CERT\": \"$PLAY_CA_CERT\""    
 | |
| fi
 | |
| EXTRA_VARS="$EXTRA_VARS, \"TESTF_ANSIBLE_SRC\": \"$PWD\""
 | |
| 
 | |
| # maybe dynamically determine this - but some of these conflict - e.g. qemu and lxc
 | |
| #HOSTVMS_FEATURES="['vagrant', 'virtualbox', 'lxc']" # 'packer', 'qemu', 'libvirt', 'docker'
 | |
| #EXTRA_VARS="$EXTRA_VARS, \"HOSTVMS_FEATURES\": \"$HOSTVMS_FEATURES\""
 | |
| 
 | |
| EXTRA_VARS="$EXTRA_VARS, \"BOX_HOST\": \"$BOX_HOST\""
 | |
| # TESTF_QERC_USERFILE - NOT $HOME in case this is run as root - let it default
 | |
| [ -z "$RUN_QERC_USERFILE" ] && [ -f "$RUN_QERC_USERFILE" ] && \
 | |
|     EXTRA_VARS="$EXTRA_VARS, \"RUN_QERC_USERFILE\": \"$RUN_QERC_USERFILE\"" # may not exist
 | |
| 
 | |
| # EXTRA_VARS="$EXTRA_VARS, \"INCD_SKEL_USERS_LIST\": [\"$BOX_USER_NAME\", \"mike\"]"
 | |
| 
 | |
| EXTRA_VARS="$EXTRA_VARS, \"ROLES\": [\"base\""
 | |
| for role in $roles ; do
 | |
|     [ "$role" = "base" ] && continue
 | |
|     EXTRA_VARS="$EXTRA_VARS, \"$role\""
 | |
|   done
 | |
| EXTRA_VARS="$EXTRA_VARS]}"
 | |
| 
 | |
| 
 | |
| if false && [ $check -eq 0 ] && [ $list_tags -eq 0 ] && [ $list_tasks -eq 0 ] && [ "$tags" = "untagged"  ] && \
 | |
|        ! wget -O /dev/null --no-check-certificate http://google.com ; then
 | |
|     WARN "We cant reach the Internet - reauthenticate with the proxy?"
 | |
|   fi
 | |
| 
 | |
| [ -f hosts.yml ] || cat > hosts.yml << EOF
 | |
| # -*- mode: yaml; tab-width: 0; coding: utf-8 -*-
 | |
| 
 | |
| ---
 | |
| 
 | |
| all:
 | |
|   children:    
 | |
|     localgroup:
 | |
|       hosts:
 | |
|         localhost:
 | |
|       vars:
 | |
|         ansible_connection: "local"
 | |
| EOF
 | |
| yamllint -c .yamllint.rc -f standard hosts.yml || {
 | |
|     ERROR yamllint -c .yamllint.rc -f standard hosts.yml
 | |
|     exit 5
 | |
| }
 | |
| [ -f ansible.cfg ] || cat > ansible.cfg << EOF
 | |
| [defaults]
 | |
| stdout_callback: yaml
 | |
| log_path = ./var/tmp/2019/10/03/testforge_pydev_.pydev.log
 | |
| # callback_plugins = $WD/lib/plugins/
 | |
| # /i/data/DevOps/net/Http/docs.ansible.com/ansible/intro_configuration.html
 | |
| # http://docs.ansible.com/ansible/intro_configuration.html#command-warnings
 | |
| callback_whitelist = timer
 | |
| command_warnings = False
 | |
| retry_files_enabled = False
 | |
| deprecation_warnings = False
 | |
| display_args_to_stdout = False
 | |
| error_on_undefined_vars = True
 | |
| force_color = False
 | |
| forks = 5
 | |
| #   Ansible by default will override variables in specific precedence orders, as described in Variables.
 | |
| #   When a variable of higher precedence wins, it will replace the other value.
 | |
| #?! hash_behaviour = merged
 | |
| #! fatal: [localhost]: FAILED! => {"changed": false, "cmd": "/bin/lsblk --list --noheadings --paths --output NAME,UUID --exclude 2", "msg": "Timer expired after 30 seconds", "rc": 257}
 | |
| gather_timeout = 120
 | |
| internal_poll_interval=0.1
 | |
| #   This sets the interval (in seconds) of Ansible internal processes polling each other. Lower values
 | |
| #   improve performance with large playbooks at the expense of extra CPU load. Higher values are more
 | |
| #   suitable for Ansible usage in automation scenarios, when UI responsiveness is not required but CPU usage
 | |
| #   might be a concern. Default corresponds to the value hardcoded in  2.1:
 | |
| # Fixme: should be per user
 | |
| local_tmp = /var/tmp
 | |
| # library = /usr/share/ansible
 | |
| library = $WD/library
 | |
| 
 | |
| nocows = 0
 | |
| roles_path = $WD/roles
 | |
| handler_includes_static = True
 | |
| timeout = 60
 | |
| EOF
 | |
| 
 | |
| # Fixme: should be per user
 | |
| # local_tmp = /var/tmp
 | |
| 
 | |
| log_dir="`dirname $log_relpath`"
 | |
| if [ -d $log_dir ] ; then
 | |
|     cp /dev/null $log_relpath
 | |
|   else
 | |
|     mkdir -p $log_dir
 | |
|   fi
 | |
| ls $log_dir >/dev/null || { ERROR ls $log_dir ; exit 3 ; }
 | |
| touch $log_relpath || { ERROR $prog  $log_relpat not wrieaable; exit 4 ; }
 | |
| ls -l $log_relpath || exit 5
 | |
| 
 | |
| #?[ -x /usr/local/bin/clean_path.bash ] && N="`/usr/local/bin/clean_path.bash`" || N=$PATH
 | |
| # echo "INFO: PATH=$PATH"
 | |
| # `grep log_path ansible.cfg`
 | |
| 
 | |
| if [ -z "$http_proxy" ] ; then
 | |
|     DBUG make sure http_proxy and no_proxy are set if you need them
 | |
|     . /usr/local/bin/proxy_export.bash
 | |
| else
 | |
|     DBUG "http_proxy=$http_proxy CORP_NTLM_PROXY=$CORP_NTLM_PROXY"
 | |
|   fi
 | |
| 
 | |
| # [ -z "${DISPLAY}" ] && EXE="xvfb-run ${EXE}"
 | |
| 
 | |
| INFO "$EXE $LARGS --extra-vars \'$EXTRA_VARS\' ansible_local.yml"
 | |
| DBUG PYTHON_MINOR=$PYTHON_MINOR PYTHONPATH=$PYTHONPATH
 | |
| 
 | |
| if ! ps ax | grep -v grep | grep -q ansible-playbook ; then
 | |
|     # clean the /var/tmp directory
 | |
|     rm -rf /var/tmp/ansible-*
 | |
|   fi
 | |
| #? bash --norc $PYTHON_EXE
 | |
| 
 | |
| yamllint -c .yamllint.rc -f standard ansible_local.yml || {
 | |
|     ERROR yamllint -c .yamllint.rc -f ansible_local.yml
 | |
|     exit 8
 | |
| }
 | |
| # strace -o /tmp/check.str
 | |
| exec env $ANSIBLE_ENV $EXE $LARGS \
 | |
|      --extra-vars "$EXTRA_VARS" \
 | |
|      ansible_local.yml
 |