Skip to content

Commit fd0b87d

Browse files
committed
Add read only mode for local ironic run
This commit: - Adds an option to the local ironic deployment script to run the containers with a read-only file system - Adds additional mounts for the Ironic containers regardless if a container runs with a read-only file system or not This commit is needed because otherwise developers would be unable to run the local ironic deployment with read-only root file system. Signed-off-by: Adam Rozman <[email protected]>
1 parent 179ac4b commit fd0b87d

File tree

2 files changed

+109
-68
lines changed

2 files changed

+109
-68
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ go.work.sum
2929
*.tmp
3030
.DS_Store
3131
.zed*
32+
*.swp
3233

3334
# Tilt files.
3435
.tiltbuild

tools/run_local_ironic.sh

Lines changed: 108 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ set -ex
44

55
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
66

7-
IRONIC_IMAGE=${IRONIC_IMAGE:-"quay.io/metal3-io/ironic:main"}
8-
IRONIC_KEEPALIVED_IMAGE=${IRONIC_KEEPALIVED_IMAGE:-"quay.io/metal3-io/keepalived"}
9-
IPA_DOWNLOADER_IMAGE=${IPA_DOWNLOADER_IMAGE:-"quay.io/metal3-io/ironic-ipa-downloader:main"}
10-
MARIADB_IMAGE=${MARIADB_IMAGE:-"quay.io/metal3-io/mariadb:main"}
7+
IRONIC_IMAGE="${IRONIC_IMAGE:-quay.io/metal3-io/ironic:main}"
8+
IRONIC_KEEPALIVED_IMAGE="${IRONIC_KEEPALIVED_IMAGE:-quay.io/metal3-io/keepalived}"
9+
IPA_DOWNLOADER_IMAGE="${IPA_DOWNLOADER_IMAGE:-quay.io/metal3-io/ironic-ipa-downloader:main}"
10+
MARIADB_IMAGE="${MARIADB_IMAGE:-quay.io/metal3-io/mariadb:main}"
11+
12+
IPA_BASEURI="${IPA_BASEURI:-}"
13+
IRONIC_DATA_DIR="${IRONIC_DATA_DIR:-/opt/metal3-dev-env/ironic}"
14+
IRONIC_CONF_DIR="${IRONIC_CONF_DIR:-${IRONIC_DATA_DIR}/conf}"
15+
KEEPALIVED_DATA_DIR="${IRONIC_DATA_DIR}/keepalived"
16+
RO_FS="${RO_FS:-false}"
1117

12-
IPA_BASEURI=${IPA_BASEURI:-}
13-
IRONIC_DATA_DIR=${IRONIC_DATA_DIR:-"/opt/metal3-dev-env/ironic"}
1418
CONTAINER_RUNTIME="${CONTAINER_RUNTIME:-podman}"
15-
HTTP_PORT=${HTTP_PORT:-"6180"}
19+
HTTP_PORT="${HTTP_PORT:-6180}"
1620
PROVISIONING_IP="${PROVISIONING_IP:-"172.22.0.1"}"
1721
CLUSTER_PROVISIONING_IP="${CLUSTER_PROVISIONING_IP:-"172.22.0.2"}"
1822
# ironicendpoint is used in the CI setup
@@ -22,14 +26,14 @@ else
2226
PROVISIONING_INTERFACE="${PROVISIONING_INTERFACE:-}"
2327
fi
2428
CLUSTER_DHCP_RANGE="${CLUSTER_DHCP_RANGE:-"172.22.0.10,172.22.0.100"}"
25-
IRONIC_KERNEL_PARAMS="${IRONIC_KERNEL_PARAMS:-"console=ttyS0"}"
26-
IRONIC_BOOT_ISO_SOURCE="${IRONIC_BOOT_ISO_SOURCE:-"local"}"
27-
export NAMEPREFIX=${NAMEPREFIX:-"capm3"}
29+
IRONIC_KERNEL_PARAMS="${IRONIC_KERNEL_PARAMS:-console=ttyS0}"
30+
IRONIC_BOOT_ISO_SOURCE="${IRONIC_BOOT_ISO_SOURCE:-local}"
31+
export NAMEPREFIX="${NAMEPREFIX:-capm3}"
2832

2933
IRONIC_CACERT_FILE="${IRONIC_CACERT_FILE:-}"
3034
IRONIC_CERT_FILE="${IRONIC_CERT_FILE:-}"
3135
IRONIC_KEY_FILE="${IRONIC_KEY_FILE:-}"
32-
IRONIC_TLS_SETUP=${IRONIC_TLS_SETUP:-"true"}
36+
IRONIC_TLS_SETUP="${IRONIC_TLS_SETUP:-true}"
3337

3438
MARIADB_CACERT_FILE="${MARIADB_CACERT_FILE:-}"
3539
MARIADB_CERT_FILE="${MARIADB_CERT_FILE:-}"
@@ -49,17 +53,20 @@ HTTPS_PROXY="${HTTPS_PROXY:-}"
4953
NO_PROXY="${NO_PROXY:-}"
5054

5155
# Ensure that the MariaDB key file allow a non-owned user to read.
52-
if [ -n "${MARIADB_KEY_FILE}" ]
53-
then
56+
if [[ -n "${MARIADB_KEY_FILE}" ]]; then
5457
chmod 604 "${MARIADB_KEY_FILE}"
5558
fi
5659

5760
sudo mkdir -p "${IRONIC_DATA_DIR}/auth"
61+
sudo mkdir -p "${IRONIC_CONF_DIR}"
62+
sudo rm -rf "${KEEPALIVED_DATA_DIR}"
63+
sudo mkdir -p "${KEEPALIVED_DATA_DIR}"
5864

59-
if [ "$IRONIC_TLS_SETUP" = "true" ]; then
65+
66+
if [[ "${IRONIC_TLS_SETUP}" = "true" ]]; then
6067
sudo mkdir -p "${IRONIC_DATA_DIR}/tls"
6168

62-
if [ -z "$IRONIC_CERT_FILE" ]; then
69+
if [[ -z "${IRONIC_CERT_FILE}" ]]; then
6370
IRONIC_CERT_FILE="${IRONIC_DATA_DIR}/tls/ironic.crt"
6471
IRONIC_KEY_FILE="${IRONIC_DATA_DIR}/tls/ironic.key"
6572
IRONIC_CACERT_FILE="${IRONIC_CERT_FILE}"
@@ -69,7 +76,7 @@ if [ "$IRONIC_TLS_SETUP" = "true" ]; then
6976
fi
7077

7178
export IRONIC_BASE_URL="https://${CLUSTER_PROVISIONING_IP}"
72-
if [ -z "$IRONIC_CACERT_FILE" ]; then
79+
if [[ -z "${IRONIC_CACERT_FILE}" ]]; then
7380
export IRONIC_CACERT_FILE=$IRONIC_CERT_FILE
7481
fi
7582
else
@@ -78,18 +85,18 @@ fi
7885

7986
DEPLOY_KERNEL_URL="${DEPLOY_KERNEL_URL:-"http://${CLUSTER_PROVISIONING_IP}:${HTTP_PORT}/images/ironic-python-agent.kernel"}"
8087
DEPLOY_RAMDISK_URL="${DEPLOY_RAMDISK_URL:-"http://${CLUSTER_PROVISIONING_IP}:${HTTP_PORT}/images/ironic-python-agent.initramfs"}"
81-
DEPLOY_ISO_URL=${DEPLOY_ISO_URL:-}
88+
DEPLOY_ISO_URL="${DEPLOY_ISO_URL:-}"
8289
IRONIC_ENDPOINT="${IRONIC_ENDPOINT:-"${IRONIC_BASE_URL}:6385/v1/"}"
8390
CACHEURL="${CACHEURL:-"http://${PROVISIONING_IP}/images"}"
8491
IRONIC_FAST_TRACK="${IRONIC_FAST_TRACK:-"true"}"
85-
IRONIC_REVERSE_PROXY_SETUP=${IRONIC_REVERSE_PROXY_SETUP:-"true"}
86-
IRONIC_USE_MARIADB=${IRONIC_USE_MARIADB:-"false"}
87-
if [[ $IRONIC_TLS_SETUP == *false* ]]
92+
IRONIC_REVERSE_PROXY_SETUP="${IRONIC_REVERSE_PROXY_SETUP:-"true"}"
93+
IRONIC_USE_MARIADB="${IRONIC_USE_MARIADB:-"false"}"
94+
if [[ "${IRONIC_TLS_SETUP}" == *false* ]]
8895
then
8996
# No reverse proxy for Ironic if TLS is not used
9097
IRONIC_REVERSE_PROXY_SETUP="false"
9198
fi
92-
IRONIC_INSPECTOR_VLAN_INTERFACES=${IRONIC_INSPECTOR_VLAN_INTERFACES:-"all"}
99+
IRONIC_INSPECTOR_VLAN_INTERFACES="${IRONIC_INSPECTOR_VLAN_INTERFACES:-"all"}"
93100

94101
cat << EOF | sudo tee "${IRONIC_DATA_DIR}/ironic-vars.env"
95102
HTTP_PORT=${HTTP_PORT}
@@ -115,7 +122,7 @@ NO_PROXY=${NO_PROXY}
115122
USE_IRONIC_INSPECTOR=false
116123
EOF
117124

118-
if [ "$IRONIC_TLS_SETUP" == "true" ] && [ -n "$IRONIC_CA_CERT_B64" ]; then
125+
if [[ "$IRONIC_TLS_SETUP" == "true" ]] && [[ -n "$IRONIC_CA_CERT_B64" ]]; then
119126
# shellcheck disable=SC2086
120127
cat << EOF | kubectl apply -f -
121128
apiVersion: v1
@@ -129,32 +136,32 @@ type: Opaque
129136
EOF
130137
fi
131138

132-
sudo "${CONTAINER_RUNTIME}" pull "$IRONIC_IMAGE"
133-
sudo "${CONTAINER_RUNTIME}" pull "$IRONIC_KEEPALIVED_IMAGE"
134-
if [ "$IRONIC_USE_MARIADB" = "true" ]; then
135-
sudo "${CONTAINER_RUNTIME}" pull "$MARIADB_IMAGE"
139+
sudo "${CONTAINER_RUNTIME}" pull "${IRONIC_IMAGE}"
140+
sudo "${CONTAINER_RUNTIME}" pull "${IRONIC_KEEPALIVED_IMAGE}"
141+
if [ "${IRONIC_USE_MARIADB}" = "true" ]; then
142+
sudo "${CONTAINER_RUNTIME}" pull "${MARIADB_IMAGE}"
136143
fi
137144

138-
CERTS_MOUNTS=""
145+
CERTS_MOUNTS="-v ${IRONIC_DATA_DIR}/tls:/certs "
139146

140-
if [ -r "$IRONIC_CACERT_FILE" ]; then
141-
CERTS_MOUNTS="-v ${IRONIC_CACERT_FILE}:/certs/ca/ironic/tls.crt "
147+
if [[ -r "{$IRONIC_CACERT_FILE}" ]]; then
148+
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${IRONIC_CACERT_FILE}:/certs/ca/ironic/tls.crt "
142149
fi
143150

144-
if [ -r "$IRONIC_CERT_FILE" ]; then
151+
if [[ -r "${IRONIC_CERT_FILE}" ]]; then
145152
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${IRONIC_CERT_FILE}:/certs/ironic/tls.crt "
146153
fi
147-
if [ -r "$IRONIC_KEY_FILE" ]; then
154+
if [[ -r "${IRONIC_KEY_FILE}" ]]; then
148155
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${IRONIC_KEY_FILE}:/certs/ironic/tls.key "
149156
fi
150157

151-
if [ -r "$MARIADB_CACERT_FILE" ]; then
152-
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${MARIADB_CACERT_FILE}:/certs/ca/mariadb/tls.crt "
158+
if [[ -r "${MARIADB_CACERT_FILE}" ]]; then
159+
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${MARIADB_CACERT_FILE}:/certs/ca/mariadb/tls.crt "
153160
fi
154-
if [ -r "$MARIADB_CERT_FILE" ]; then
161+
if [[ -r "${MARIADB_CERT_FILE}" ]]; then
155162
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${MARIADB_CERT_FILE}:/certs/mariadb/tls.crt "
156163
fi
157-
if [ -r "$MARIADB_KEY_FILE" ]; then
164+
if [[ -r "${MARIADB_KEY_FILE}" ]]; then
158165
CERTS_MOUNTS="${CERTS_MOUNTS} -v ${MARIADB_KEY_FILE}:/certs/mariadb/tls.key "
159166
fi
160167

@@ -172,31 +179,36 @@ BASIC_AUTH_MOUNTS=""
172179
IRONIC_HTPASSWD_FILE="${IRONIC_DATA_DIR}/auth/ironic-htpasswd"
173180
IRONIC_HTPASSWD_MOUNT=""
174181
set +x
175-
if [ -n "$IRONIC_USERNAME" ]; then
176-
htpasswd -n -b -B "${IRONIC_USERNAME}" "${IRONIC_PASSWORD}" > "${IRONIC_HTPASSWD_FILE}"
182+
if [[ -n "$IRONIC_USERNAME" ]]; then
183+
htpasswd -n -b -B "${IRONIC_USERNAME}" \
184+
"${IRONIC_PASSWORD}" > "${IRONIC_HTPASSWD_FILE}"
177185
IRONIC_HTPASSWD_MOUNT="-v ${IRONIC_HTPASSWD_FILE}:/auth/ironic/htpasswd"
178186
fi
179187
set -x
180188

181189
sudo mkdir -p "$IRONIC_DATA_DIR/html/images"
182-
# Locally supplied IPA images are imported here when the environment variables are set accordingly.
183-
# Name of the IPA archive is expected to be "ironic-python-agent.tar" at all times.
190+
# Locally supplied IPA images are imported here when the environment variables
191+
# are set accordingly. Name of the IPA archive is expected to be
192+
# "ironic-python-agent.tar" at all times.
184193
if ${USE_LOCAL_IPA} && ! ${IPA_DOWNLOAD_ENABLED}; then
185-
sudo cp "${LOCAL_IPA_PATH}/ironic-python-agent.tar" "$IRONIC_DATA_DIR/html/images"
186-
sudo tar --extract --file "$IRONIC_DATA_DIR/html/images/ironic-python-agent.tar" \
187-
--directory "$IRONIC_DATA_DIR/html/images"
194+
sudo cp "${LOCAL_IPA_PATH}/ironic-python-agent.tar" \
195+
"${IRONIC_DATA_DIR}/html/images"
196+
sudo tar --extract \
197+
--file "${IRONIC_DATA_DIR}/html/images/ironic-python-agent.tar" \
198+
--directory "${IRONIC_DATA_DIR}/html/images"
188199
fi
189200

190201
# The images directory should contain images and an associated md5sum.
191202
# - image.qcow2
192203
# - image.qcow2.md5sum
193-
# By default, image directory points to dir having needed images when metal3-dev-env environment in use.
204+
# By default, image directory points to dir having needed images when
205+
# metal3-dev-env environment in use.
194206
# In other cases user has to store images beforehand.
195207

196208
"$SCRIPTDIR/tools/remove_local_ironic.sh"
197209

198210
set +x
199-
if [ "$IRONIC_USE_MARIADB" = "true" ]; then
211+
if [[ "$IRONIC_USE_MARIADB" = "true" ]]; then
200212
# set password for mariadb
201213
mariadb_password=$(echo "$(date;hostname)"|sha256sum |cut -c-20)
202214
IRONIC_MARIADB_PASSWORD="--env MARIADB_PASSWORD=$mariadb_password"
@@ -220,56 +232,84 @@ fi
220232
# Start image downloader container
221233
if ${IPA_DOWNLOAD_ENABLED}; then
222234
# shellcheck disable=SC2086
223-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ipa-downloader \
224-
${POD} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
225-
-v "$IRONIC_DATA_DIR:/shared" "${IPA_DOWNLOADER_IMAGE}" /usr/local/bin/get-resource.sh
235+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
236+
--read-only="${RO_FS}" --name ipa-downloader \
237+
${POD} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
238+
-v "$IRONIC_DATA_DIR:/shared" \
239+
"${IPA_DOWNLOADER_IMAGE}" /usr/local/bin/get-resource.sh
226240

227241
sudo "${CONTAINER_RUNTIME}" wait ipa-downloader
228242
fi
229243

230244
# Start dnsmasq, http, mariadb, and ironic containers using same image
231245

246+
# Start dnsmaq
232247
# See this file for env vars you can set, like IP, DHCP_RANGE, INTERFACE
233248
# https://github.com/metal3-io/ironic-image/blob/main/scripts/rundnsmasq
234249
# shellcheck disable=SC2086
235-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name dnsmasq \
236-
${POD} ${CERTS_MOUNTS} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
237-
-v "$IRONIC_DATA_DIR:/shared" --entrypoint /bin/rundnsmasq "${IRONIC_IMAGE}"
238-
250+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
251+
--read-only="${RO_FS}" --name dnsmasq \
252+
${POD} ${CERTS_MOUNTS} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
253+
-v "$IRONIC_DATA_DIR:/shared" \
254+
-v "${IRONIC_CONF_DIR}:/conf" \
255+
-v "$IRONIC_DATA_DIR:/data" \
256+
--entrypoint /bin/rundnsmasq "${IRONIC_IMAGE}"
257+
258+
# Start httpd
239259
# See this file for env vars you can set, like IP, DHCP_RANGE, INTERFACE
240260
# https://github.com/metal3-io/ironic-image/blob/main/scripts/runhttpd
241261
# shellcheck disable=SC2086
242-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name httpd \
243-
${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD_MOUNT} \
244-
--env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
245-
-v "${IRONIC_DATA_DIR}:/shared" --entrypoint /bin/runhttpd "${IRONIC_IMAGE}"
262+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
263+
--read-only="${RO_FS}" --name httpd \
264+
${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD_MOUNT} \
265+
--env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
266+
-v "${IRONIC_DATA_DIR}:/shared" \
267+
-v "${IRONIC_CONF_DIR}:/conf" \
268+
-v "$IRONIC_DATA_DIR:/data" \
269+
-v "/tmp:/var/tmp" \
270+
--entrypoint /bin/runhttpd "${IRONIC_IMAGE}"
246271

247272
if [ "$IRONIC_USE_MARIADB" = "true" ]; then
248273
# https://github.com/metal3-io/mariadb-image/blob/main/runmariadb
249274
# shellcheck disable=SC2086
250275
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name mariadb \
251-
${POD} ${CERTS_MOUNTS} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
252-
-v "$IRONIC_DATA_DIR:/shared" \
253-
--env "MARIADB_PASSWORD=$mariadb_password" "${MARIADB_IMAGE}"
276+
${POD} ${CERTS_MOUNTS} \
277+
--env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
278+
-v "$IRONIC_DATA_DIR:/shared" \
279+
--env "MARIADB_PASSWORD=$mariadb_password" \
280+
"${MARIADB_IMAGE}"
254281
fi
255282

256-
# See this file for additional env vars you may want to pass, like IP and INTERFACE
283+
# Start ironic
284+
# See this file for additional env vars you may want to pass, e.g IP, INTERFACE
257285
# https://github.com/metal3-io/ironic-image/blob/main/scripts/runironic
258286
# shellcheck disable=SC2086
259-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic \
260-
${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD_MOUNT} \
261-
--env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
262-
${IRONIC_MARIADB_PASSWORD} --entrypoint /bin/runironic \
263-
-v "$IRONIC_DATA_DIR:/shared" "${IRONIC_IMAGE}"
287+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
288+
--read-only="${RO_FS}" --name ironic \
289+
${POD} ${CERTS_MOUNTS} ${BASIC_AUTH_MOUNTS} ${IRONIC_HTPASSWD_MOUNT} \
290+
--env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
291+
${IRONIC_MARIADB_PASSWORD} --entrypoint /bin/runironic \
292+
-v "$IRONIC_DATA_DIR:/shared" \
293+
-v "${IRONIC_CONF_DIR}:/conf" \
294+
-v "$IRONIC_DATA_DIR:/data" \
295+
-v "/tmp:/var/tmp" \
296+
"${IRONIC_IMAGE}"
264297

265298
# Start ironic-endpoint-keepalived
266299
# shellcheck disable=SC2086
267-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic-endpoint-keepalived \
300+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
301+
--read-only="${RO_FS}" --name ironic-endpoint-keepalived \
268302
${POD} --env-file "${IRONIC_DATA_DIR}/ironic-vars.env" \
269-
-v "$IRONIC_DATA_DIR:/shared" "${IRONIC_KEEPALIVED_IMAGE}"
303+
-v "$IRONIC_DATA_DIR:/shared" \
304+
-v "${IRONIC_CONF_DIR}:/conf" \
305+
-v "$IRONIC_DATA_DIR:/data" \
306+
"${IRONIC_KEEPALIVED_IMAGE}"
270307

271308
# Start ironic-log-watch
272309
# shellcheck disable=SC2086
273-
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged --name ironic-log-watch \
310+
sudo "${CONTAINER_RUNTIME}" run -d --net host --privileged \
311+
--read-only="${RO_FS}" --name ironic-log-watch \
274312
${POD} --entrypoint /bin/runlogwatch.sh \
275-
-v "$IRONIC_DATA_DIR:/shared" "${IRONIC_IMAGE}"
313+
-v "$IRONIC_DATA_DIR:/shared" \
314+
-v "${IRONIC_CONF_DIR}:/conf" \
315+
"${IRONIC_IMAGE}"

0 commit comments

Comments
 (0)