我是cloudformation yaml的新手。
我需要在启动配置中将以下用作用户数据:
UserData:
Fn::Base64: !Sub
- |
#!/bin/bash -x
apt-get -y update && apt install -y awscli mysql-client libmysqlclient-dev python-pip
for item in certs user_prop config log
do
echo "... preparing ${item} database and config"
MYSQL_DB_NAME="ext_as_${item}"
LOCAL_DB_NAME=$(echo ${item}|tr -d '_')
LOCAL_DB_FILE="/path/to/db/${LOCAL_DB_NAME}"
DB_KEY="${item}_db"
#- set db configuration value
sed -i "s|${DB_KEY}=.*|${DB_KEY}==mysql://${DB_FQDN}/${MYSQL_DB_NAME}|" /path/to/config.conf
#- create mysql db
mysql --defaults-file=${MYSQL_PREF} -e "CREATE DATABASE IF NOT EXISTS $${MYSQL_DB_NAME};"
#- import local DB schema into MySql if no tables exist
mysql --defaults-file=$${MYSQL_PREF} --silent --skip-column-names \
-e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '${MYSQL_DB_NAME}';"|grep -e ^0 -q \
&& ./dbcvt -t ${item} -s sqlite:///${LOCAL_DB_FILE} -d mysql://${DB_FQDN}/${MYSQL_DB_NAME} -p ${MYSQL_PREF}
done
popd
-
DB_FQDN:
'Fn::ImportValue': 'OVPNConfigDbEndpoint'
现在问题是DB_FQDN
得到解决,但LOCAL_DB_FILE
,LOCAL_DB_NAME
,DB_KEY
,MYSQL_DB_NAME
和MYSQL_PREF
没有得到解决。现在的问题是:
Fn::Join
编写简单的Shell脚本似乎很复杂。 +
在!Sub |+
中是什么意思?答案 0 :(得分:0)
您遇到的问题是,您希望在Bash Shell中扩展${item}
之类的变量,而Fn::Sub
Cloudformation内在函数也将${item}
解释为要扩展的变量。
如docs中所述:
要从字面上写一个美元符号和大括号(
${}
),请在打开的大括号之后添加感叹号(!
),例如${!Literal}
。 AWS CloudFormation将此文本解析为${Literal}
。
但是请记住,Bash中的括号通常是可选的。也就是说,您通常可以简单地将${item}
重写为$item
。
快速查看您的代码会告诉我,您可以像这样重写它,这应该没问题:
UserData:
Fn::Base64: !Sub
- |
#!/bin/bash -x
apt-get -y update && apt install -y awscli mysql-client libmysqlclient-dev python-pip
for item in certs user_prop config log
do
echo "... preparing $item database and config"
MYSQL_DB_NAME="ext_as_$item"
LOCAL_DB_NAME=$(echo $item | tr -d '_')
LOCAL_DB_FILE="/path/to/db/$LOCAL_DB_NAME"
DB_KEY="${!item}_db"
#- set db configuration value
sed -i "s|$DB_KEY=.*|$DB_KEY==mysql://${DB_FQDN}/$MYSQL_DB_NAME|" /path/to/config.conf
#- create mysql db
mysql --defaults-file=$MYSQL_PREF -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DB_NAME;"
#- import local DB schema into MySql if no tables exist
mysql --defaults-file=$MYSQL_PREF --silent --skip-column-names \
-e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '$MYSQL_DB_NAME';"|grep -e ^0 -q \
&& ./dbcvt -t $item -s sqlite:///$LOCAL_DB_FILE -d mysql://${DB_FQDN}/$MYSQL_DB_NAME -p $MYSQL_PREF
done
popd
-
DB_FQDN:
'Fn::ImportValue': 'OVPNConfigDbEndpoint'
注意点:
请注意,在DB_KEY
上需要使用${!item}
表示法,因为否则Bash会扩展变量${item_db}
而不使用大括号。
对于${DB_FQDN}
,您当然需要使用${DB_FQDN}
,因为在那种情况下,您确实希望用Fb::Sub
进行替换。
还请注意,我在您的Bash中修复了一些错字。您在2个地方有$$
的错字。
对于您的其他问题:
否,您不需要使用Fn::Join
。您正在查看的问题是,是否有人出于某种原因想要插值Fn::Join
。该答案显示了您可以执行此操作的一种方法。
符号|+
是YAML语言的功能。它只是说在换行符之后保留换行符。请参阅此YAML cheatsheet。