ansible/test/lib/ansible_test/_data/setup/remote.sh
Matt Clay 672941fb0d
Add test support for Python 3.8 on RHEL and FreeBSD. (#73393)
* Support Python 3.8 on RHEL 8.2+ in ansible-test.

* Support Python 3.8 on FreeBSD in ansible-test.

* Use libyaml with PyYAML on FreeBSD.
2021-01-27 21:35:29 -08:00

202 lines
6.3 KiB
Bash

#!/bin/sh
set -eu
platform="$1"
platform_version="$2"
python_version="$3"
python_interpreter="python${python_version}"
cd ~/
install_pip () {
if ! "${python_interpreter}" -m pip.__main__ --version --disable-pip-version-check 2>/dev/null; then
case "${python_version}" in
*)
pip_bootstrap_url="https://ansible-ci-files.s3.amazonaws.com/ansible-test/get-pip-20.3.4.py"
;;
esac
curl --silent --show-error "${pip_bootstrap_url}" -o /tmp/get-pip.py
"${python_interpreter}" /tmp/get-pip.py --disable-pip-version-check --quiet
rm /tmp/get-pip.py
fi
}
if [ "${platform}" = "freebsd" ]; then
py_version="$(echo "${python_version}" | tr -d '.')"
if [ "${py_version}" = "27" ]; then
# on Python 2.7 our only option is to use virtualenv
virtualenv_pkg="py27-virtualenv"
else
# on Python 3.x we'll use the built-in venv instead
virtualenv_pkg=""
fi
# Declare platform/python version combinations which do not have supporting OS packages available.
# For these combinations ansible-test will use pip to install the requirements instead.
case "${platform_version}/${python_version}" in
"11.4/3.8")
have_os_packages=""
;;
"12.2/3.8")
have_os_packages=""
;;
*)
have_os_packages="yes"
;;
esac
# PyYAML is never installed with an OS package since it does not include libyaml support.
# Instead, ansible-test will always install it using pip.
if [ "${have_os_packages}" ]; then
jinja2_pkg="py${py_version}-Jinja2"
cryptography_pkg="py${py_version}-cryptography"
else
jinja2_pkg=""
cryptography_pkg=""
fi
while true; do
# shellcheck disable=SC2086
env ASSUME_ALWAYS_YES=YES pkg bootstrap && \
pkg install -q -y \
bash \
curl \
gtar \
libyaml \
"python${py_version}" \
${jinja2_pkg} \
${cryptography_pkg} \
${virtualenv_pkg} \
sudo \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
install_pip
if ! grep '^PermitRootLogin yes$' /etc/ssh/sshd_config > /dev/null; then
sed -i '' 's/^# *PermitRootLogin.*$/PermitRootLogin yes/;' /etc/ssh/sshd_config
service sshd restart
fi
elif [ "${platform}" = "rhel" ]; then
if grep '8\.' /etc/redhat-release; then
py_version="$(echo "${python_version}" | tr -d '.')"
if [ "${py_version}" = "36" ]; then
py_pkg_prefix="python3"
else
py_pkg_prefix="python${py_version}"
fi
while true; do
yum module install -q -y "python${py_version}" && \
yum install -q -y \
gcc \
"${py_pkg_prefix}-devel" \
"${py_pkg_prefix}-jinja2" \
"${py_pkg_prefix}-cryptography" \
iptables \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
else
while true; do
yum install -q -y \
gcc \
python-devel \
python-virtualenv \
python2-cryptography \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
install_pip
fi
# pin packaging and pyparsing to match the downstream vendored versions
"${python_interpreter}" -m pip install packaging==20.4 pyparsing==2.4.7 --disable-pip-version-check
elif [ "${platform}" = "centos" ]; then
while true; do
yum install -q -y \
gcc \
python-devel \
python-virtualenv \
python2-cryptography \
libffi-devel \
openssl-devel \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
install_pip
elif [ "${platform}" = "osx" ]; then
while true; do
pip install --disable-pip-version-check --quiet \
'virtualenv==16.7.10' \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
elif [ "${platform}" = "aix" ]; then
chfs -a size=1G /
chfs -a size=4G /usr
chfs -a size=1G /var
chfs -a size=1G /tmp
chfs -a size=2G /opt
while true; do
yum install -q -y \
gcc \
libffi-devel \
python-jinja2 \
python-cryptography \
python-pip && \
pip install --disable-pip-version-check --quiet \
'virtualenv==16.7.10' \
&& break
echo "Failed to install packages. Sleeping before trying again..."
sleep 10
done
fi
# Generate our ssh key and add it to our authorized_keys file.
# We also need to add localhost's server keys to known_hosts.
if [ ! -f "${HOME}/.ssh/id_rsa.pub" ]; then
ssh-keygen -m PEM -q -t rsa -N '' -f "${HOME}/.ssh/id_rsa"
# newer ssh-keygen PEM output (such as on RHEL 8.1) is not recognized by paramiko
touch "${HOME}/.ssh/id_rsa.new"
chmod 0600 "${HOME}/.ssh/id_rsa.new"
sed 's/\(BEGIN\|END\) PRIVATE KEY/\1 RSA PRIVATE KEY/' "${HOME}/.ssh/id_rsa" > "${HOME}/.ssh/id_rsa.new"
mv "${HOME}/.ssh/id_rsa.new" "${HOME}/.ssh/id_rsa"
cat "${HOME}/.ssh/id_rsa.pub" >> "${HOME}/.ssh/authorized_keys"
chmod 0600 "${HOME}/.ssh/authorized_keys"
for key in /etc/ssh/ssh_host_*_key.pub; do
pk=$(cat "${key}")
echo "localhost ${pk}" >> "${HOME}/.ssh/known_hosts"
done
fi
# Improve prompts on remote host for interactive use.
# shellcheck disable=SC1117
cat << EOF > ~/.bashrc
if ls --color > /dev/null 2>&1; then
alias ls='ls --color'
elif ls -G > /dev/null 2>&1; then
alias ls='ls -G'
fi
export PS1='\[\e]0;\u@\h: \w\a\]\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
EOF
# Make sure ~/ansible/ is the starting directory for interactive shells.
if [ "${platform}" = "osx" ]; then
echo "cd ~/ansible/" >> ~/.bashrc
elif [ "${platform}" = "macos" ] ; then
echo "export BASH_SILENCE_DEPRECATION_WARNING=1" >> ~/.bashrc
echo "cd ~/ansible/" >> ~/.bashrc
fi