in Ica34b7525bab53f8a6d161401f7fb9a2dbe37bc3 we added support for installing puppet5 on bionic nodes. However we missed adding the package name. Which results in the expansion[1]: apt-get --option Dpkg::Options::=--force-confold --assume-yes install -y --force-yes git rubygems and later puppet isn't installed[2]: Failed to stop puppet.service: Unit puppet.service not loaded. Adding the pkg name gets us[3] [1] http://logs.openstack.org/41/588441/1/check/build-wheel-mirror-ubuntu-bionic/b3fd7ef/job-output.txt.gz#_2018-08-22_23_42_42_196476 [2] http://logs.openstack.org/41/588441/1/check/build-wheel-mirror-ubuntu-bionic/b3fd7ef/job-output.txt.gz#_2018-08-22_23_42_46_453880 [3] http://paste.openstack.org/raw/728653/ Change-Id: Icbcf5268624a5ff75e0058f8a355881125cd5d79
		
			
				
	
	
		
			383 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash -x
 | 
						|
 | 
						|
# Copyright 2013 OpenStack Foundation.
 | 
						|
# Copyright 2013 Hewlett-Packard Development Company, L.P.
 | 
						|
# Copyright 2013 Red Hat, Inc.
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
						|
# not use this file except in compliance with the License. You may obtain
 | 
						|
# a copy of the License at
 | 
						|
#
 | 
						|
#      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
# License for the specific language governing permissions and limitations
 | 
						|
# under the License.
 | 
						|
 | 
						|
# NOTE(pabelanger): We now use the pip-and-virtualenv element from
 | 
						|
# diskimage-builder to do this. Default to true for backwards compatibility.
 | 
						|
SETUP_PIP=${SETUP_PIP:-true}
 | 
						|
 | 
						|
#
 | 
						|
# Distro identification functions
 | 
						|
#  note, can't rely on lsb_release for these as we're bare-bones and
 | 
						|
#  it may not be installed yet)
 | 
						|
function is_fedora {
 | 
						|
    [ -f /usr/bin/yum ] && cat /etc/*release | grep -q -e "Fedora"
 | 
						|
}
 | 
						|
 | 
						|
function is_rhel7 {
 | 
						|
    [ -f /usr/bin/yum ] && \
 | 
						|
        cat /etc/*release | grep -q -e "Red Hat" -e "CentOS" -e "CloudLinux" && \
 | 
						|
        cat /etc/*release | grep -q 'release 7'
 | 
						|
}
 | 
						|
 | 
						|
function is_ubuntu {
 | 
						|
    [ -f /usr/bin/apt-get ]
 | 
						|
}
 | 
						|
 | 
						|
function is_opensuse {
 | 
						|
    [ -f /usr/bin/zypper ] && \
 | 
						|
        cat /etc/os-release | grep -q -e "openSUSE"
 | 
						|
}
 | 
						|
 | 
						|
function is_gentoo {
 | 
						|
    [ -f /usr/bin/emerge ]
 | 
						|
}
 | 
						|
 | 
						|
# dnf is a drop-in replacement for yum on Fedora>=22
 | 
						|
YUM=yum
 | 
						|
if is_fedora && [[ $(lsb_release -rs) -ge 22 ]]; then
 | 
						|
    YUM=dnf
 | 
						|
fi
 | 
						|
 | 
						|
# Set the puppet version
 | 
						|
if cat /etc/os-release | grep -qi bionic; then
 | 
						|
    # bionic only supports puppet 5
 | 
						|
    PUPPET_VERSION=${PUPPET_VERSION:-5}
 | 
						|
else
 | 
						|
    PUPPET_VERSION=${PUPPET_VERSION:-3}
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
# Distro specific puppet installs
 | 
						|
#
 | 
						|
 | 
						|
function _systemd_update {
 | 
						|
    # there is a bug (rhbz#1261747) where systemd can fail to enable
 | 
						|
    # services due to selinux errors after upgrade.  A work-around is
 | 
						|
    # to install the latest version of selinux and systemd here and
 | 
						|
    # restart the daemon for good measure after it is upgraded.
 | 
						|
    $YUM install -y selinux-policy
 | 
						|
    $YUM install -y systemd
 | 
						|
    systemctl daemon-reload
 | 
						|
}
 | 
						|
 | 
						|
function setup_puppet_fedora {
 | 
						|
    _systemd_update
 | 
						|
 | 
						|
    $YUM update -y
 | 
						|
 | 
						|
    # NOTE: we preinstall lsb_release here to ensure facter sets
 | 
						|
    # lsbdistcodename
 | 
						|
    #
 | 
						|
    # Fedora declares some global hardening flags, which distutils
 | 
						|
    # pick up when building python modules.  redhat-rpm-config
 | 
						|
    # provides the required config options.  Really this should be a
 | 
						|
    # dependency of python-devel (fix in the works, see
 | 
						|
    # https://bugzilla.redhat.com/show_bug.cgi?id=1217376) and can be
 | 
						|
    # removed when that is sorted out.
 | 
						|
 | 
						|
    $YUM install -y redhat-lsb-core git puppet \
 | 
						|
        redhat-rpm-config
 | 
						|
 | 
						|
    mkdir -p /etc/puppet/modules/
 | 
						|
 | 
						|
    if $SETUP_PIP; then
 | 
						|
        # Puppet expects the pip command named as pip-python on
 | 
						|
        # Fedora, as per the packaged command name.  However, we're
 | 
						|
        # installing from get-pip.py so it's just 'pip'.  An easy
 | 
						|
        # work-around is to just symlink pip-python to "fool" it.
 | 
						|
        # See upstream issue:
 | 
						|
        #  https://tickets.puppetlabs.com/browse/PUP-1082
 | 
						|
        ln -fs /usr/bin/pip /usr/bin/pip-python
 | 
						|
    fi
 | 
						|
 | 
						|
    # Wipe out templatedir so we don't get warnings about it
 | 
						|
    sed -i '/templatedir/d' /etc/puppet/puppet.conf
 | 
						|
    # Wipe out server, as we don't have one.
 | 
						|
    sed -i '/server/d' /etc/puppet/puppet.conf
 | 
						|
 | 
						|
    # upstream is currently looking for /run/systemd files to check
 | 
						|
    # for systemd.  This fails in a chroot where /run isn't mounted
 | 
						|
    # (like when using dib).  Comment out this confine as fedora
 | 
						|
    # always has systemd
 | 
						|
    #  see
 | 
						|
    #   https://github.com/puppetlabs/puppet/pull/4481
 | 
						|
    #   https://bugzilla.redhat.com/show_bug.cgi?id=1254616
 | 
						|
    sudo sed -i.bak  '/^[^#].*/ s|\(^.*confine :exists => \"/run/systemd/system\".*$\)|#\ \1|' \
 | 
						|
        /usr/share/ruby/vendor_ruby/puppet/provider/service/systemd.rb
 | 
						|
 | 
						|
    # upstream "requests" pip package vendors urllib3 and chardet
 | 
						|
    # packages.  The fedora packages un-vendor this, and symlink those
 | 
						|
    # sub-packages back to packaged versions.  We get into a real mess
 | 
						|
    # of if some of the puppet ends up pulling in "requests" from pip,
 | 
						|
    # and then something like devstack does a "yum install
 | 
						|
    # python-requests" which does a very bad job at overwriting the
 | 
						|
    # pip-installed version (symlinks and existing directories don't
 | 
						|
    # mix).  A solution is to pre-install the python-requests
 | 
						|
    # package; clear it out and re-install from pip.  This way, the
 | 
						|
    # package is installed for dependencies, and we have a pip-managed
 | 
						|
    # requests with correctly vendored sub-packages.
 | 
						|
    sudo ${YUM} install -y python2-requests
 | 
						|
    sudo rm -rf /usr/lib/python2.7/site-packages/requests/*
 | 
						|
    sudo rm -rf /usr/lib/python2.7/site-packages/requests-*.{egg,dist}-info
 | 
						|
    sudo pip install requests
 | 
						|
}
 | 
						|
 | 
						|
function setup_puppet_rhel7 {
 | 
						|
    # NOTE(pabelanger): In openstack-infra, we already have epel on
 | 
						|
    # our nodes, properly configured for mirrors and gpg keys; thus
 | 
						|
    # check to see if the package is installed first.
 | 
						|
    if ! rpm -qa | grep -q epel-release; then
 | 
						|
        # install a bootstrap epel repo to install latest epel-release
 | 
						|
        # package (which provides correct gpg keys, etc); then remove
 | 
						|
        # boostrap
 | 
						|
        cat > /etc/yum.repos.d/epel-bootstrap.repo <<EOF
 | 
						|
[epel-bootstrap]
 | 
						|
name=Bootstrap EPEL
 | 
						|
mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=epel-7&arch=\$basearch
 | 
						|
failovermethod=priority
 | 
						|
enabled=0
 | 
						|
gpgcheck=0
 | 
						|
EOF
 | 
						|
        yum --enablerepo=epel-bootstrap -y install epel-release
 | 
						|
        rm -f /etc/yum.repos.d/epel-bootstrap.repo
 | 
						|
    fi
 | 
						|
 | 
						|
    _systemd_update
 | 
						|
    yum update -y
 | 
						|
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        puppetpkg=puppet
 | 
						|
        local puppet_repo="https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm"
 | 
						|
    elif [ "$PUPPET_VERSION" == "4" ] ; then
 | 
						|
        puppetpkg=puppet-agent
 | 
						|
        local puppet_repo="https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm"
 | 
						|
    else
 | 
						|
        echo "Unsupported puppet version ${PUPPET_VERSION}"
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    # NOTE: we preinstall lsb_release to ensure facter sets lsbdistcodename
 | 
						|
    yum install -y redhat-lsb-core git
 | 
						|
 | 
						|
    # Install puppetlabs repo & then puppet comes from there
 | 
						|
    rpm -ivh $puppet_repo
 | 
						|
 | 
						|
    yum install -y $puppetpkg
 | 
						|
 | 
						|
    if $SETUP_PIP; then
 | 
						|
        # see comments in setup_puppet_fedora
 | 
						|
        ln -s /usr/bin/pip /usr/bin/pip-python
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        # Wipe out templatedir so we don't get warnings about it
 | 
						|
        sed -i '/templatedir/d' /etc/puppet/puppet.conf
 | 
						|
        # Wipe out server, as we don't have one.
 | 
						|
        sed -i '/server/d' /etc/puppet/puppet.conf
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function setup_puppet_ubuntu {
 | 
						|
    if ! which lsb_release > /dev/null 2<&1 ; then
 | 
						|
        DEBIAN_FRONTEND=noninteractive apt-get --option 'Dpkg::Options::=--force-confold' \
 | 
						|
            --assume-yes install -y --force-yes lsb-release
 | 
						|
    fi
 | 
						|
 | 
						|
    lsbdistcodename=`lsb_release -c -s`
 | 
						|
    if [ $lsbdistcodename != 'trusty' ] ; then
 | 
						|
        rubypkg=rubygems
 | 
						|
    else
 | 
						|
        rubypkg=ruby
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        if [ $lsbdistcodename != 'xenial' ] ; then
 | 
						|
            puppet_deb=puppetlabs-release-${lsbdistcodename}.deb
 | 
						|
        else
 | 
						|
            puppet_deb=''
 | 
						|
        fi
 | 
						|
        PUPPET_VERSION=3.*
 | 
						|
        puppetpkg=puppet
 | 
						|
        FACTER_VERSION=2.*
 | 
						|
    elif [ "$PUPPET_VERSION" == "4" ] ; then
 | 
						|
        puppet_deb=puppetlabs-release-pc1-${lsbdistcodename}.deb
 | 
						|
        puppetpkg=puppet-agent
 | 
						|
        PUPPET_VERSION=4.*
 | 
						|
        FACTER_VERSION=3.*
 | 
						|
    elif [ "$PUPPET_VERSION" == "5" ] ; then
 | 
						|
        puppet_deb=puppet5-release-bionic.deb
 | 
						|
        puppetpkg=puppet-agent
 | 
						|
        PUPPET_VERSION=5.*
 | 
						|
        FACTER_VERSION=3.*
 | 
						|
    else
 | 
						|
        echo "Unsupported puppet version ${PUPPET_VERSION}"
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    cat > /etc/apt/preferences.d/00-puppet.pref <<EOF
 | 
						|
Package: puppet puppet-common puppetmaster puppetmaster-common puppetmaster-passenger
 | 
						|
Pin: version $PUPPET_VERSION
 | 
						|
Pin-Priority: 501
 | 
						|
 | 
						|
Package: facter
 | 
						|
Pin: version $FACTER_VERSION
 | 
						|
Pin-Priority: 501
 | 
						|
EOF
 | 
						|
 | 
						|
 | 
						|
    # NOTE(pabelanger): Puppetlabs does not support ubuntu xenial for puppet 3. Instead use
 | 
						|
    # the version of puppet ship by xenial.
 | 
						|
    if [ -n "$puppet_deb" ]; then
 | 
						|
        if type curl >/dev/null 2>&1; then
 | 
						|
            curl -O http://apt.puppetlabs.com/$puppet_deb
 | 
						|
        else
 | 
						|
            wget http://apt.puppetlabs.com/$puppet_deb -O $puppet_deb
 | 
						|
        fi
 | 
						|
        dpkg -i $puppet_deb
 | 
						|
        rm $puppet_deb
 | 
						|
    fi;
 | 
						|
 | 
						|
    apt-get update
 | 
						|
    DEBIAN_FRONTEND=noninteractive apt-get --option 'Dpkg::Options::=--force-confold' \
 | 
						|
        --assume-yes dist-upgrade
 | 
						|
    DEBIAN_FRONTEND=noninteractive apt-get --option 'Dpkg::Options::=--force-confold' \
 | 
						|
        --assume-yes install -y --force-yes $puppetpkg git $rubypkg
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        # Wipe out templatedir so we don't get warnings about it
 | 
						|
        sed -i '/templatedir/d' /etc/puppet/puppet.conf
 | 
						|
        # Wipe out server, as we don't have one.
 | 
						|
        sed -i '/server/d' /etc/puppet/puppet.conf
 | 
						|
    fi
 | 
						|
    # ensure the agent is stopped and disabled
 | 
						|
    if [ -f /bin/systemctl ]; then
 | 
						|
        service puppet stop
 | 
						|
        systemctl disable puppet
 | 
						|
    else
 | 
						|
        /etc/init.d/puppet stop
 | 
						|
        update-rc.d -f puppet disable
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function setup_puppet_opensuse {
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        puppetpkg=puppet
 | 
						|
    else
 | 
						|
        echo "Unsupported puppet version ${PUPPET_VERSION}"
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
    zypper --non-interactive install --force-resolution $puppetpkg
 | 
						|
    # Wipe out templatedir so we don't get warnings about it
 | 
						|
    sed -i '/templatedir/d' /etc/puppet/puppet.conf
 | 
						|
    # Wipe out server, as we don't have one.
 | 
						|
    sed -i '/server/d' /etc/puppet/puppet.conf
 | 
						|
}
 | 
						|
 | 
						|
function setup_puppet_gentoo {
 | 
						|
    echo yes | emaint sync -a
 | 
						|
 | 
						|
    if [ "$PUPPET_VERSION" == "3" ] ; then
 | 
						|
        puppetpkg=puppet-agent
 | 
						|
    else
 | 
						|
        echo "Unsupported puppet version ${PUPPET_VERSION}"
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
    emerge -q --jobs=4 $puppetpkg
 | 
						|
    sed -i '/templatedir/d' /etc/puppetlabs/puppet/puppet.conf
 | 
						|
    # Wipe out server, as we don't have one.
 | 
						|
    sed -i '/server/d' /etc/puppetlabs/puppet/puppet.conf
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# pip setup
 | 
						|
#
 | 
						|
 | 
						|
function setup_pip {
 | 
						|
    # Install pip using get-pip
 | 
						|
    local get_pip_url=https://bootstrap.pypa.io/get-pip.py
 | 
						|
    local ret=1
 | 
						|
 | 
						|
    if [ -f ./get-pip.py ]; then
 | 
						|
        ret=0
 | 
						|
    elif type curl >/dev/null 2>&1; then
 | 
						|
        curl -O $get_pip_url
 | 
						|
        ret=$?
 | 
						|
    elif type wget >/dev/null 2>&1; then
 | 
						|
        wget $get_pip_url
 | 
						|
        ret=$?
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ $ret -ne 0 ]; then
 | 
						|
        echo "Failed to get get-pip.py"
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    if is_opensuse; then
 | 
						|
        zypper --non-interactive install --force-resolution python python-xml
 | 
						|
    fi
 | 
						|
 | 
						|
    python get-pip.py
 | 
						|
    rm get-pip.py
 | 
						|
 | 
						|
    # we are about to overwrite setuptools, but some packages we
 | 
						|
    # install later might depend on the python-setuptools package.  To
 | 
						|
    # avoid later conflicts, and because distro packages don't include
 | 
						|
    # enough info for pip to certain it can fully uninstall the old
 | 
						|
    # package, for safety we clear it out by hand (this seems to have
 | 
						|
    # been a problem with very old to new updates, e.g. centos6 to
 | 
						|
    # current-era, but less so for smaller jumps).  There is a bit of
 | 
						|
    # chicken-and-egg problem with pip in that it requires setuptools
 | 
						|
    # for some operations, such as wheel creation.  But just
 | 
						|
    # installing setuptools shouldn't require setuptools itself, so we
 | 
						|
    # are safe for this small section.
 | 
						|
    if is_rhel7 || is_fedora; then
 | 
						|
        yum install -y python-setuptools
 | 
						|
        rm -rf /usr/lib/python2.7/site-packages/setuptools*
 | 
						|
    fi
 | 
						|
 | 
						|
    pip install -U setuptools
 | 
						|
}
 | 
						|
 | 
						|
# Need to install python2 early as pip and ansible need it and it
 | 
						|
# isn't necessarily previously installed on newer Ubuntu releases.
 | 
						|
if is_ubuntu; then
 | 
						|
    if ! which python > /dev/null 2<&1 ; then
 | 
						|
        DEBIAN_FRONTEND=noninteractive apt-get update
 | 
						|
        DEBIAN_FRONTEND=noninteractive apt-get --option 'Dpkg::Options::=--force-confold' \
 | 
						|
            --assume-yes install -y --force-yes python-minimal
 | 
						|
    fi
 | 
						|
fi
 | 
						|
 | 
						|
if $SETUP_PIP; then
 | 
						|
    setup_pip
 | 
						|
fi
 | 
						|
 | 
						|
if is_fedora; then
 | 
						|
    setup_puppet_fedora
 | 
						|
elif is_rhel7; then
 | 
						|
    setup_puppet_rhel7
 | 
						|
elif is_ubuntu; then
 | 
						|
    setup_puppet_ubuntu
 | 
						|
elif is_opensuse; then
 | 
						|
    setup_puppet_opensuse
 | 
						|
elif is_gentoo; then
 | 
						|
    setup_puppet_gentoo
 | 
						|
else
 | 
						|
    echo "*** Can not setup puppet: distribution not recognized"
 | 
						|
    exit 1
 | 
						|
fi
 |