Redirect "apt-get install -y" stdin to /dev/null
According to debian bug 728775 [1] apt-get by design will consume stdin
(even when not run interactively).
When the run-aio-build.sh script is used as part of a curl-pipe-bash
such as described in the quick start docs [2] apt-get will effectively
halt execution of the script after installing git. The next time the
script is run it will get past the step because git is now installed and
apt-get no longer consumes stdin. In addition to run-aio-build.sh,
bootstrap-aio.sh and bootstrap-ansible.sh call apt-get and so exhibit
the same behaviour when called by run-aio-build.sh when used as part of
a curl-pipe-bash.
In addition to apt-get install -y, apt-get purge -y exhibits the same
behaviour.
The result for the end user is they must run the command multiple times
to get it to work.
Using the bash method to close stdin (0<&- [3]) causes apt-get to print
out "E: Write error - write (14: Bad address)" and fail. The solution is
to explicitly set stdin to nothing, such as "echo '' | apt-get ..." or
"apt-get ... < /dev/null". The latter is chosen for its aesthetics.
yum install -y does not exhibit this behaviour and so does not require
its stdin redirected.
[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=728775
[2] http://docs.openstack.org/developer/openstack-ansible/developer-docs/quickstart-aio.html#running-an-aio-build-in-one-step
[3] http://www.tldp.org/LDP/abs/html/io-redirection.html
Change-Id: I57484590e257956e1d1bc8e10ce8a35207622672
Closes-Bug: 1504546
(cherry picked from commit 05f10294e6)
This commit is contained in:
committed by
Jesse Pretorius
parent
e8c9af21e5
commit
a344925ca8
@@ -78,7 +78,7 @@ if [ ! "$(grep -e '^nameserver 8.8.8.8' -e '^nameserver 8.8.4.4' /etc/resolv.con
|
||||
fi
|
||||
|
||||
# Ensure that the https apt transport is available before doing anything else
|
||||
apt-get update && apt-get install -y apt-transport-https
|
||||
apt-get update && apt-get install -y apt-transport-https < /dev/null
|
||||
|
||||
# Set the host repositories to only use the same ones, always, for the sake of consistency.
|
||||
cat > /etc/apt/sources.list <<EOF
|
||||
@@ -96,7 +96,7 @@ EOF
|
||||
apt-get update
|
||||
|
||||
# Remove known conflicting packages in the base image
|
||||
apt-get purge -y libmysqlclient18 mysql-common
|
||||
apt-get purge -y libmysqlclient18 mysql-common < /dev/null
|
||||
|
||||
# Install required packages
|
||||
apt-get install -y bridge-utils \
|
||||
@@ -112,7 +112,7 @@ apt-get install -y bridge-utils \
|
||||
tmux \
|
||||
vim \
|
||||
vlan \
|
||||
xfsprogs
|
||||
xfsprogs < /dev/null
|
||||
|
||||
# Flush all the iptables rules set by openstack-infra
|
||||
if [ "${FLUSH_IPTABLES}" == "yes" ]; then
|
||||
@@ -305,7 +305,7 @@ done
|
||||
|
||||
if [ ${DEPLOY_CEILOMETER} == "yes" ]; then
|
||||
# Install mongodb on the aio1 host
|
||||
apt-get install mongodb-server mongodb-clients python-pymongo -y
|
||||
apt-get install mongodb-server mongodb-clients python-pymongo -y < /dev/null
|
||||
# Change bind_ip to management ip
|
||||
sed -i "s/^bind_ip.*/bind_ip = $MONGO_HOST/" /etc/mongodb.conf
|
||||
# Asserting smallfiles key
|
||||
|
||||
@@ -46,7 +46,7 @@ ssh_key_create
|
||||
APT=`command -v apt-get` || true
|
||||
YUM=`command -v yum` || true
|
||||
if [[ "$APT" != "" ]]; then
|
||||
apt-get update && apt-get -y install git python-all python-dev curl autoconf g++ python2.7-dev
|
||||
apt-get update && apt-get -y install git python-all python-dev curl autoconf g++ python2.7-dev < /dev/null
|
||||
elif [[ "$YUM" != "" ]]; then
|
||||
yum check-update && yum -y install git python2 curl autoconf gcc-c++ python2-devel
|
||||
fi
|
||||
|
||||
@@ -29,7 +29,10 @@ export WORKING_FOLDER=${WORKING_FOLDER:-"/opt/openstack-ansible"}
|
||||
set -x
|
||||
|
||||
# install git so that we can fetch the repo
|
||||
apt-get update && apt-get install -y git
|
||||
# note: the redirect of stdin to /dev/null is necessary for when this script is
|
||||
# run as part of a curl-pipe-shell. otherwise apt-get will consume the rest of
|
||||
# this file as if it was its own stdin (despite using -y to skip interaction).
|
||||
apt-get update && apt-get install -y git < /dev/null
|
||||
|
||||
# fetch the repo
|
||||
git clone -b ${REPO_BRANCH} ${REPO_URL} ${WORKING_FOLDER}
|
||||
|
||||
Reference in New Issue
Block a user