Merge branch '18682-use-keyrings-instead-of-key-ids'
authorJavier Bértoli <jbertoli@curii.com>
Fri, 4 Mar 2022 23:15:52 +0000 (20:15 -0300)
committerJavier Bértoli <jbertoli@curii.com>
Fri, 4 Mar 2022 23:15:52 +0000 (20:15 -0300)
closes #18682
Arvados-DCO-1.1-Signed-off-by: Javier Bértoli <jbertoli@curii.com>

1  2 
tools/salt-install/local.params.example.single_host_single_hostname
tools/salt-install/provision.sh

index 4c129c9c85a1a09ae444c8b89b7a6e186fb3052b,998c4a3ab6bb0fad32ccb8e1c9b69c66733e30cc..a1cd491bc21bac9536a57dbb022851861f68da12
@@@ -5,36 -5,42 +5,36 @@@
  
  # These are the basic parameters to configure the installation
  
 -# The FIVE ALPHANUMERIC CHARACTERS name you want to give your cluster
 +# The Arvados cluster ID, needs to be five alphanumeric characters.
  CLUSTER="cluster_fixme_or_this_wont_work"
  
 -# The domainname you want tou give to your cluster's hosts
 +# The domainname for your cluster's hosts
  DOMAIN="domain_fixme_or_this_wont_work"
  
 -# Set this value when installing a cluster in a single host with a single hostname
 -# to access all the instances. Not used in the other examples.
 -# When using virtualization (ie AWS), this should be
 -# the EXTERNAL/PUBLIC hostname for the instance.
 -# If empty, ${CLUSTER}.${DOMAIN} will be used
 -HOSTNAME_EXT=""
 -# The internal hostname for the host. In the example files, only used in the
 -# single_host/single_hostname example
 -HOSTNAME_INT="127.0.1.1"
 -# Host SSL port where you want to point your browser to access Arvados
 -# Defaults to 443 for regular runs, and to 8443 when called in Vagrant.
 -# You can point it to another port if desired
 -# In Vagrant, make sure it matches what you set in the Vagrantfile (8443)
 -CONTROLLER_EXT_SSL_PORT=9443
 -KEEP_EXT_SSL_PORT=35101
 -# Both for collections and downloads
 -KEEPWEB_EXT_SSL_PORT=11002
 -WEBSHELL_EXT_SSL_PORT=14202
 -WEBSOCKET_EXT_SSL_PORT=18002
 -WORKBENCH1_EXT_SSL_PORT=9444
 -WORKBENCH2_EXT_SSL_PORT=9445
 +# Set this value when installing a cluster in a single host with a single
 +# hostname to access all the instances. HOSTNAME_EXT should be set to the
 +# external hostname for the instance.
 +HOSTNAME_EXT="hostname_ext_fixme_or_this_wont_work"
  
 -INITIAL_USER="admin"
 +# The internal IP address for the host.
 +IP_INT="ip_int_fixme_or_this_wont_work"
 +
 +# External ports used by the Arvados services
 +CONTROLLER_EXT_SSL_PORT=8800
 +KEEP_EXT_SSL_PORT=8801
 +KEEPWEB_EXT_SSL_PORT=8802
 +WEBSHELL_EXT_SSL_PORT=8803
 +WEBSOCKET_EXT_SSL_PORT=8804
 +WORKBENCH1_EXT_SSL_PORT=8805
 +WORKBENCH2_EXT_SSL_PORT=443
  
 +INITIAL_USER="admin"
  # If not specified, the initial user email will be composed as
  # INITIAL_USER@CLUSTER.DOMAIN
  INITIAL_USER_EMAIL="admin@cluster_fixme_or_this_wont_work.domain_fixme_or_this_wont_work"
  INITIAL_USER_PASSWORD="password"
  
 -# YOU SHOULD CHANGE THESE TO SOME RANDOM STRINGS
 +# Populate these values with random strings
  BLOB_SIGNING_KEY=blobsigningkeymushaveatleast32characters
  MANAGEMENT_TOKEN=managementtokenmushaveatleast32characters
  SYSTEM_ROOT_TOKEN=systemroottokenmushaveatleast32characters
@@@ -43,22 -49,20 +43,22 @@@ WORKBENCH_SECRET_KEY=workbenchsecretkey
  DATABASE_PASSWORD=please_set_this_to_some_secure_value
  
  # SSL CERTIFICATES
 -# Arvados REQUIRES valid SSL to work correctly. Otherwise, some components will
 -# fail to communicate and can silently drop traffic. Set USE_LETSENCRYPT="yes"
 -# to use the Let's Encrypt salt formula
 -# (https://github.com/saltstack-formulas/letsencrypt-formula) to automatically
 -# obtain and install SSL certificates for your hostname(s).
 +# Arvados requires SSL certificates to work correctly. This installer supports these options:
 +# * self-signed: let the installer create self-signed certificate(s)
 +# * bring-your-own: supply your own certificate(s) in the `certs` directory
 +# * lets-encrypt: automatically obtain and install SSL certificates for your hostname(s)
  #
 -# Alternatively, set this variable to "no" and provide and upload your own
 -# certificates to the instances and modify the 'nginx_*' salt pillars
 -# accordingly
 -USE_LETSENCRYPT="no"
 +# See https://doc.arvados.org/intall/salt-single-host.html#certificates for more information.
 +SSL_MODE="self-signed"
 +
 +# CUSTOM_CERTS_DIR is only used when SSL_MODE is set to "bring-your-own".
 +# See https://doc.arvados.org/intall/salt-single-host.html#bring-your-own for more information.
 +# CUSTOM_CERTS_DIR="${SCRIPT_DIR}/certs"
  
  # The directory to check for the config files (pillars, states) you want to use.
  # There are a few examples under 'config_examples'.
  # CONFIG_DIR="local_config_dir"
 +
  # Extra states to apply. If you use your own subdir, change this value accordingly
  # EXTRA_STATES_DIR="${CONFIG_DIR}/states"
  
@@@ -78,8 -82,8 +78,8 @@@ RELEASE="production
  
  # Formulas versions
  # ARVADOS_TAG="2.2.0"
- # POSTGRES_TAG="v0.43.0"
+ # POSTGRES_TAG="v0.44.0"
  # NGINX_TAG="v2.8.0"
- # DOCKER_TAG="v2.0.7"
+ # DOCKER_TAG="v2.4.0"
  # LOCALE_TAG="v0.3.4"
  # LETSENCRYPT_TAG="v2.1.0"
index 644b87cbbf9c254eaf4c9782b7def1c47a565c4a,67a171fc4ea067f1c4856616d5f42ac288b687bf..27dada1eab5802cee177a2953779e6f137047cd8
@@@ -168,7 -168,8 +168,7 @@@ CLUSTER="
  DOMAIN=""
  
  # Hostnames/IPs used for single-host deploys
 -HOSTNAME_EXT=""
 -HOSTNAME_INT="127.0.1.1"
 +IP_INT="127.0.1.1"
  
  # Initial user setup
  INITIAL_USER=""
@@@ -184,8 -185,7 +184,8 @@@ WEBSOCKET_EXT_SSL_PORT=800
  WORKBENCH1_EXT_SSL_PORT=443
  WORKBENCH2_EXT_SSL_PORT=3001
  
 -USE_LETSENCRYPT="no"
 +SSL_MODE="self-signed"
 +USE_LETSENCRYPT_ROUTE53="no"
  CUSTOM_CERTS_DIR="${SCRIPT_DIR}/certs"
  
  ## These are ARVADOS-related parameters
@@@ -204,9 -204,9 +204,9 @@@ VERSION="latest
  # BRANCH="main"
  
  # Other formula versions we depend on
- POSTGRES_TAG="v0.43.0"
+ POSTGRES_TAG="v0.44.0"
  NGINX_TAG="v2.8.0"
- DOCKER_TAG="v2.0.7"
+ DOCKER_TAG="v2.4.0"
  LOCALE_TAG="v0.3.4"
  LETSENCRYPT_TAG="v2.1.0"
  
@@@ -254,21 -254,7 +254,21 @@@ if ! grep -qE '^[[:alnum:]]{5}$' <<<${C
  fi
  
  # Only used in single_host/single_name deploys
 -if [ "x${HOSTNAME_EXT}" = "x" ] ; then
 +if [ ! -z "${HOSTNAME_EXT}" ] ; then
 +  # We need to add some extra control vars to manage a single certificate vs. multiple
 +  USE_SINGLE_HOSTNAME="yes"
 +  # Make sure that the value configured as IP_INT is a real IP on the system.
 +  # If we don't error out early here when there is a mismatch, the formula will
 +  # fail with hard to interpret nginx errors later on.
 +  ip addr list |grep -q " ${IP_INT}/"
 +  if [[ $? -ne 0 ]]; then
 +    echo "Unable to find the IP_INT address '${IP_INT}' on the system, please correct the value in local.params. Exiting..."
 +    exit 1
 +  fi
 +else
 +  USE_SINGLE_HOSTNAME="no"
 +  # We set this variable, anyway, so sed lines do not fail and we don't need to add more
 +  # conditionals
    HOSTNAME_EXT="${CLUSTER}.${DOMAIN}"
  fi
  
@@@ -327,23 -313,18 +327,23 @@@ rm -rf ${F_DIR}/* || exit 
  git clone --quiet https://github.com/saltstack-formulas/docker-formula.git ${F_DIR}/docker
  ( cd docker && git checkout --quiet tags/"${DOCKER_TAG}" -b "${DOCKER_TAG}" )
  
 +echo "...locale"
  git clone --quiet https://github.com/saltstack-formulas/locale-formula.git ${F_DIR}/locale
  ( cd locale && git checkout --quiet tags/"${LOCALE_TAG}" -b "${LOCALE_TAG}" )
  
 +echo "...nginx"
  git clone --quiet https://github.com/saltstack-formulas/nginx-formula.git ${F_DIR}/nginx
  ( cd nginx && git checkout --quiet tags/"${NGINX_TAG}" -b "${NGINX_TAG}" )
  
 +echo "...postgres"
  git clone --quiet https://github.com/saltstack-formulas/postgres-formula.git ${F_DIR}/postgres
  ( cd postgres && git checkout --quiet tags/"${POSTGRES_TAG}" -b "${POSTGRES_TAG}" )
  
 +echo "...letsencrypt"
  git clone --quiet https://github.com/saltstack-formulas/letsencrypt-formula.git ${F_DIR}/letsencrypt
  ( cd letsencrypt && git checkout --quiet tags/"${LETSENCRYPT_TAG}" -b "${LETSENCRYPT_TAG}" )
  
 +echo "...arvados"
  git clone --quiet https://git.arvados.org/arvados-formula.git ${F_DIR}/arvados
  
  # If we want to try a specific branch of the formula
@@@ -380,7 -361,7 +380,7 @@@ for f in $(ls "${SOURCE_PILLARS_DIR}"/*
         s#__CLUSTER__#${CLUSTER}#g;
         s#__DOMAIN__#${DOMAIN}#g;
         s#__HOSTNAME_EXT__#${HOSTNAME_EXT}#g;
 -       s#__HOSTNAME_INT__#${HOSTNAME_INT}#g;
 +       s#__IP_INT__#${IP_INT}#g;
         s#__INITIAL_USER_EMAIL__#${INITIAL_USER_EMAIL}#g;
         s#__INITIAL_USER_PASSWORD__#${INITIAL_USER_PASSWORD}#g;
         s#__INITIAL_USER__#${INITIAL_USER}#g;
  mkdir -p ${T_DIR}
  # Replace cluster and domain name in the test files
  for f in $(ls "${SOURCE_TESTS_DIR}"/*); do
 -  sed "s#__CLUSTER__#${CLUSTER}#g;
 +  FILTERS="s#__CLUSTER__#${CLUSTER}#g;
         s#__CONTROLLER_EXT_SSL_PORT__#${CONTROLLER_EXT_SSL_PORT}#g;
         s#__DOMAIN__#${DOMAIN}#g;
 -       s#__HOSTNAME_INT__#${HOSTNAME_INT}#g;
 +       s#__IP_INT__#${IP_INT}#g;
         s#__INITIAL_USER_EMAIL__#${INITIAL_USER_EMAIL}#g;
         s#__INITIAL_USER_PASSWORD__#${INITIAL_USER_PASSWORD}#g
         s#__INITIAL_USER__#${INITIAL_USER}#g;
         s#__DATABASE_PASSWORD__#${DATABASE_PASSWORD}#g;
 -       s#__SYSTEM_ROOT_TOKEN__#${SYSTEM_ROOT_TOKEN}#g" \
 -  "${f}" > ${T_DIR}/$(basename "${f}")
 +       s#__SYSTEM_ROOT_TOKEN__#${SYSTEM_ROOT_TOKEN}#g"
 +  if [ "$USE_SINGLE_HOSTNAME" = "yes" ]; then
 +    FILTERS="s#__CLUSTER__.__DOMAIN__#${HOSTNAME_EXT}#g;
 +       $FILTERS"
 +  fi
 +  sed "$FILTERS" \
 +    "${f}" > ${T_DIR}/$(basename "${f}")
  done
  chmod 755 ${T_DIR}/run-test.sh
  
@@@ -450,7 -426,7 +450,7 @@@ if [ -d "${SOURCE_STATES_DIR}" ]; the
           s#__CONTROLLER_EXT_SSL_PORT__#${CONTROLLER_EXT_SSL_PORT}#g;
           s#__DOMAIN__#${DOMAIN}#g;
           s#__HOSTNAME_EXT__#${HOSTNAME_EXT}#g;
 -         s#__HOSTNAME_INT__#${HOSTNAME_INT}#g;
 +         s#__IP_INT__#${IP_INT}#g;
           s#__INITIAL_USER_EMAIL__#${INITIAL_USER_EMAIL}#g;
           s#__INITIAL_USER_PASSWORD__#${INITIAL_USER_PASSWORD}#g;
           s#__INITIAL_USER__#${INITIAL_USER}#g;
@@@ -502,19 -478,18 +502,19 @@@ EOFPSL
  
  # States, extra states
  if [ -d "${F_DIR}"/extra/extra ]; then
 -  if [ "$DEV_MODE" = "yes" ]; then
 +  SKIP_SNAKE_OIL="snakeoil_certs"
 +
 +  if [[ "$DEV_MODE" = "yes" || "${SSL_MODE}" == "self-signed" ]] ; then
      # In dev mode, we create some snake oil certs that we'll
 -    # use as CUSTOM_CERTS, so we don't skip the states file
 -    SKIP_SNAKE_OIL="dont_snakeoil_certs"
 -  else
 -    SKIP_SNAKE_OIL="snakeoil_certs"
 +    # use as CUSTOM_CERTS, so we don't skip the states file.
 +    # Same when using self-signed certificates.
 +    SKIP_SNAKE_OIL="dont_add_snakeoil_certs"
    fi
    for f in $(ls "${F_DIR}"/extra/extra/*.sls | grep -v ${SKIP_SNAKE_OIL}); do
    echo "    - extra.$(basename ${f} | sed 's/.sls$//g')" >> ${S_DIR}/top.sls
    done
 -  # Use custom certs
 -  if [ "x${USE_LETSENCRYPT}" != "xyes" ]; then
 +  # Use byo or self-signed certificates
 +  if [ "${SSL_MODE}" != "lets-encrypt" ]; then
      mkdir -p "${F_DIR}"/extra/extra/files
    fi
  fi
  if [ -z "${ROLES}" ]; then
    # States
    echo "    - nginx.passenger" >> ${S_DIR}/top.sls
 -  # Currently, only available on config_examples/multi_host/aws
 -  if [ "x${USE_LETSENCRYPT}" = "xyes" ]; then
 -    if [ "x${USE_LETSENCRYPT_IAM_USER}" != "xyes" ]; then
 +  if [ "${SSL_MODE}" = "lets-encrypt" ]; then
 +    if [ "${USE_LETSENCRYPT_ROUTE53}" = "yes" ]; then
        grep -q "aws_credentials" ${S_DIR}/top.sls || echo "    - extra.aws_credentials" >> ${S_DIR}/top.sls
      fi
      grep -q "letsencrypt"     ${S_DIR}/top.sls || echo "    - letsencrypt" >> ${S_DIR}/top.sls
    else
 -    # Use custom certs
 +    # Use custom certs, as both bring-your-own and self-signed are copied using this state
      # Copy certs to formula extra/files
      # In dev mode, the files will be created and put in the destination directory by the
      # snakeoil_certs.sls state file
    echo "    - nginx_workbench_configuration" >> ${P_DIR}/top.sls
    echo "    - postgresql" >> ${P_DIR}/top.sls
  
 -  # Currently, only available on config_examples/multi_host/aws
 -  if [ "x${USE_LETSENCRYPT}" = "xyes" ]; then
 -    if [ "x${USE_LETSENCRYPT_IAM_USER}" != "xyes" ]; then
 +  if [ "${SSL_MODE}" = "lets-encrypt" ]; then
 +    if [ "${USE_LETSENCRYPT_ROUTE53}" = "yes" ]; then
        grep -q "aws_credentials" ${P_DIR}/top.sls || echo "    - aws_credentials" >> ${P_DIR}/top.sls
      fi
 -    grep -q "letsencrypt"     ${P_DIR}/top.sls || echo "    - letsencrypt" >> ${P_DIR}/top.sls
 +    grep -q "letsencrypt" ${P_DIR}/top.sls || echo "    - letsencrypt" >> ${P_DIR}/top.sls
  
      # As the pillar differ whether we use LE or custom certs, we need to do a final edition on them
-     for c in controller websocket workbench workbench2 webshell keepweb keepproxy; do
-       if [ "${USE_SINGLE_HOSTNAME}" = "yes" ]; then
-         # Are we in a single-host-single-hostname env?
-         CERT_NAME=${HOSTNAME_EXT}
-       else
-         # We are in a single-host-multiple-hostnames env
-         CERT_NAME=${c}.${CLUSTER}.${DOMAIN}
-       fi
-       sed -i "s/__CERT_REQUIRES__/cmd: create-initial-cert-${CERT_NAME}*/g;
-               s#__CERT_PEM__#/etc/letsencrypt/live/${CERT_NAME}/fullchain.pem#g;
-               s#__CERT_KEY__#/etc/letsencrypt/live/${CERT_NAME}/privkey.pem#g" \
+     for c in controller websocket workbench workbench2 webshell download collections keepproxy; do
+       sed -i "s/__CERT_REQUIRES__/cmd: create-initial-cert-${c}.${CLUSTER}.${DOMAIN}*/g;
+               s#__CERT_PEM__#/etc/letsencrypt/live/${c}.${CLUSTER}.${DOMAIN}/fullchain.pem#g;
+               s#__CERT_KEY__#/etc/letsencrypt/live/${c}.${CLUSTER}.${DOMAIN}/privkey.pem#g" \
        ${P_DIR}/nginx_${c}_configuration.sls
      done
    else
      echo "extra_custom_certs_dir: /srv/salt/certs" > ${P_DIR}/extra_custom_certs.sls
      echo "extra_custom_certs:" >> ${P_DIR}/extra_custom_certs.sls
  
 -    for c in controller websocket workbench workbench2 webshell download collections keepproxy; do
 -      grep -q ${c} ${P_DIR}/extra_custom_certs.sls || echo "  - ${c}" >> ${P_DIR}/extra_custom_certs.sls
 -
 -      # As the pillar differ whether we use LE or custom certs, we need to do a final edition on them
 -      sed -i "s/__CERT_REQUIRES__/file: extra_custom_certs_file_copy_arvados-${c}.pem/g;
 -              s#__CERT_PEM__#/etc/nginx/ssl/arvados-${c}.pem#g;
 -              s#__CERT_KEY__#/etc/nginx/ssl/arvados-${c}.key#g" \
 +    for c in controller websocket workbench workbench2 webshell keepweb keepproxy; do
 +      # Are we in a single-host-single-hostname env?
 +      if [ "${USE_SINGLE_HOSTNAME}" = "yes" ]; then
 +        # Are we in a single-host-single-hostname env?
 +        CERT_NAME=${HOSTNAME_EXT}
 +      else
 +        # We are in a multiple-hostnames env
 +        CERT_NAME=${c}
 +      fi
 +
 +      if [[ "$SSL_MODE" == "bring-your-own" ]]; then
 +        copy_custom_cert ${CUSTOM_CERTS_DIR} ${CERT_NAME}
 +      fi
 +
 +      grep -q ${CERT_NAME} ${P_DIR}/extra_custom_certs.sls || echo "  - ${CERT_NAME}" >> ${P_DIR}/extra_custom_certs.sls
 +
 +      # As the pillar differs whether we use LE or custom certs, we need to do a final edition on them
 +      sed -i "s/__CERT_REQUIRES__/file: extra_custom_certs_file_copy_arvados-${CERT_NAME}.pem/g;
 +              s#__CERT_PEM__#/etc/nginx/ssl/arvados-${CERT_NAME}.pem#g;
 +              s#__CERT_KEY__#/etc/nginx/ssl/arvados-${CERT_NAME}.key#g" \
        ${P_DIR}/nginx_${c}_configuration.sls
      done
    fi
  else
    # If we add individual roles, make sure we add the repo first
    echo "    - arvados.repo" >> ${S_DIR}/top.sls
 -  # We add the custom_certs state
 -  grep -q "custom_certs"    ${S_DIR}/top.sls || echo "    - extra.custom_certs" >> ${S_DIR}/top.sls
 +  # We add the extra_custom_certs state
 +  grep -q "extra.custom_certs"    ${S_DIR}/top.sls || echo "    - extra.custom_certs" >> ${S_DIR}/top.sls
  
    # And we add the basic part for the certs pillar
 -  if [ "x${USE_LETSENCRYPT}" != "xyes" ]; then
 +  if [ "${SSL_MODE}" != "lets-encrypt" ]; then
      # And add the certs in the custom_certs pillar
      echo "extra_custom_certs_dir: /srv/salt/certs" > ${P_DIR}/extra_custom_certs.sls
      echo "extra_custom_certs:" >> ${P_DIR}/extra_custom_certs.sls
          ### If we don't install and run LE before arvados-api-server, it fails and breaks everything
          ### after it. So we add this here as we are, after all, sharing the host for api and controller
          # Currently, only available on config_examples/multi_host/aws
 -        if [ "x${USE_LETSENCRYPT}" = "xyes" ]; then
 -          if [ "x${USE_LETSENCRYPT_IAM_USER}" != "xyes" ]; then
 +        if [ "${SSL_MODE}" = "lets-encrypt" ]; then
 +          if [ "${USE_LETSENCRYPT_ROUTE53}" = "yes" ]; then
              grep -q "aws_credentials" ${S_DIR}/top.sls || echo "    - aws_credentials" >> ${S_DIR}/top.sls
            fi
            grep -q "letsencrypt" ${S_DIR}/top.sls || echo "    - letsencrypt" >> ${S_DIR}/top.sls
          else
            # Use custom certs
 -          copy_custom_cert ${CUSTOM_CERTS_DIR} controller
 +          if [ "${SSL_MODE}" = "bring-your-own" ]; then
 +            copy_custom_cert ${CUSTOM_CERTS_DIR} controller
 +          fi
            grep -q controller ${P_DIR}/extra_custom_certs.sls || echo "  - controller" >> ${P_DIR}/extra_custom_certs.sls
          fi
          grep -q "arvados.${R}" ${S_DIR}/top.sls    || echo "    - arvados.${R}" >> ${S_DIR}/top.sls
          # States
          grep -q "nginx.passenger" ${S_DIR}/top.sls || echo "    - nginx.passenger" >> ${S_DIR}/top.sls
          # Currently, only available on config_examples/multi_host/aws
 -        if [ "x${USE_LETSENCRYPT}" = "xyes" ]; then
 -          if [ "x${USE_LETSENCRYPT_IAM_USER}" != "xyes" ]; then
 +        if [ "${SSL_MODE}" = "lets-encrypt" ]; then
 +          if [ "x${USE_LETSENCRYPT_ROUTE53}" = "xyes" ]; then
              grep -q "aws_credentials" ${S_DIR}/top.sls || echo "    - aws_credentials" >> ${S_DIR}/top.sls
            fi
            grep -q "letsencrypt"     ${S_DIR}/top.sls || echo "    - letsencrypt" >> ${S_DIR}/top.sls
          else
            # Use custom certs, special case for keepweb
            if [ ${R} = "keepweb" ]; then
 -            copy_custom_cert ${CUSTOM_CERTS_DIR} download
 -            copy_custom_cert ${CUSTOM_CERTS_DIR} collections
 +            if [ "${SSL_MODE}" = "bring-your-own" ]; then
 +              copy_custom_cert ${CUSTOM_CERTS_DIR} download
 +              copy_custom_cert ${CUSTOM_CERTS_DIR} collections
 +            fi
            else
 -            copy_custom_cert ${CUSTOM_CERTS_DIR} ${R}
 +            if [ "${SSL_MODE}" = "bring-your-own" ]; then
 +              copy_custom_cert ${CUSTOM_CERTS_DIR} ${R}
 +            fi
            fi
          fi
          # webshell role is just a nginx vhost, so it has no state
          fi
  
          # Currently, only available on config_examples/multi_host/aws
 -        if [ "x${USE_LETSENCRYPT}" = "xyes" ]; then
 -          if [ "x${USE_LETSENCRYPT_IAM_USER}" != "xyes" ]; then
 +        if [ "${SSL_MODE}" = "lets-encrypt" ]; then
 +          if [ "${USE_LETSENCRYPT_ROUTE53}" = "yes" ]; then
              grep -q "aws_credentials" ${P_DIR}/top.sls || echo "    - aws_credentials" >> ${P_DIR}/top.sls
            fi
            grep -q "letsencrypt"     ${P_DIR}/top.sls || echo "    - letsencrypt" >> ${P_DIR}/top.sls
@@@ -783,12 -733,6 +775,12 @@@ echo '\pset pager off' >> /root/.psqlr
  # Now run the install
  salt-call --local state.apply -l ${LOG_LEVEL}
  
 +# Finally, make sure that /etc/hosts is not overwritten on reboot
 +if [ -d /etc/cloud/cloud.cfg.d ]; then
 +  # TODO: will this work on CentOS?
 +  sed -i 's/^manage_etc_hosts: true/#manage_etc_hosts: true/g' /etc/cloud/cloud.cfg.d/*
 +fi
 +
  # FIXME! #16992 Temporary fix for psql call in arvados-api-server
  if [ "x${DELETE_PSQL}" = "xyes" ]; then
    echo "Removing .psql file"