Amazon ec2 用于EC2图像生成器的yaml中的多行bash脚本

Amazon ec2 用于EC2图像生成器的yaml中的多行bash脚本,amazon-ec2,yaml,Amazon Ec2,Yaml,我正在尝试创建自定义组件文档。虽然我已经使用各种yaml过梁测试了yaml文件,但EC2 Image builder抱怨出现以下错误 Failed to create component. Fix the error(s) and try again: The value supplied for parameter 'data' is not valid. Parsing step 'ConfigureMySQL' in phase 'build' failed. Error: line 4:

我正在尝试创建自定义组件文档。虽然我已经使用各种yaml过梁测试了yaml文件,但EC2 Image builder抱怨出现以下错误

Failed to create component. Fix the error(s) and try again:
The value supplied for parameter 'data' is not valid. Parsing step 'ConfigureMySQL' in phase 'build' failed. Error: line 4: cannot unmarshal map into string.
我无法找出我的yaml文件有什么问题

name: MyJavaAppTestDocument
description: This is JavaApp Document
schemaVersion: 1.0

phases:
  - name: build
    steps:
      - name: InstallSoftware
        action: ExecuteBash
        inputs:
          commands:
            - sudo yum update -y
            - sudo yum install -y java-1.8.0
            - sudo amazon-linux-extras install -y tomcat8.5
            - sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
            - sudo yum install -y mysql-community-server
      
      - name: ConfigureTomcat
        action: ExecuteBash
        inputs:
          commands:
            - sudo sed -i 's/<\/tomcat-users>/\n<role rolename="manager-gui"\/>\n  <role 
              rolename="manager-script"\/>\n  <role rolename="admin-gui"\/>\n  <user username="admin" 
              password="admin" roles="manager-gui,manager-script,admin-gui"\/>\n<\/tomcat-users>/' 
              /etc/tomcat/tomcat-users.xml
            - sudo systemctl start tomcat
            - sudo systemctl enable tomcat
      
      - name: ConfigureMySQL
        action: ExecuteBash
        inputs:
          commands:
            - sudo systemctl start mysqld
            - sudo systemctl enable mysqld
            - mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')
            - mysql -u root -p$mysqlpass --connect-expired-password -h localhost -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'whyDoTh1s@2020'"
            - |
              sudo cat <<EoF > /tmp/mysql-create-user.sql
              CREATE USER 'admin'@'%' IDENTIFIED BY 'whyDoTh1s@2020';
              GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
              EoF

            - sudo mysql -u root -pwhyDoTh1s@2020 -h localhost < /tmp/mysql-create-user.sql
名称:MyJavaAppTestDocument
描述:这是JavaApp文档
图式厌恶:1.0
阶段:
-名称:build
步骤:
-名称:InstallSoftware
操作:ExecuteBash
投入:
命令:
-sudo yum更新-y
-sudo-yum安装-y java-1.8.0
-SudoAmazonLinuxExtras安装-y tomcat8.5
-sudo yum安装-yhttps://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
-sudo yum安装-y mysql社区服务器
-名称:ConfigureTomcat
操作:ExecuteBash
投入:
命令:
-sudo sed-i的//\n\n\n\n/'
/etc/tomcat/tomcat-users.xml
-sudo systemctl启动tomcat
-sudo systemctl启用tomcat
-名称:ConfigureMySQL
操作:ExecuteBash
投入:
命令:
-sudo systemctl启动mysqld
-sudo systemctl启用mysqld
-mysqlpass=$(sudo grep‘临时密码’/var/log/mysqld.log | sed’s/*root@localhost: //')
-mysql-u root-p$mysqlpass--connect过期密码-h localhost-e“ALTER USER'root'@'localhost'由'whyDoTh1s@2020'"
- |

sudo cat由于这一行中的
而导致该错误:

- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')
YAML解析器将该行解释为创建映射,而不是在现有映射中创建字符串条目。我能够在自己的YAML中使用的一种解决方法是将
用单引号括起来,这样问题就变得复杂了

- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost':' //')

根据我自己的使用情况,我用应用的解决方案进行了测试,这应该可以解决问题。

尽管@micah-l-c answer对OP的情况有帮助

我建议另一种方法,这种方法也可以帮助解决这个问题,而且可以更正确地解决这个问题

这是一条错误的路线

- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')
这可以改写为

- |-
    mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')

现在
将通过上述方法很好地转义

我遇到了一个类似的问题,我将举一个例子,说明@micah-l-c解决方案不起作用,而上述方法效果良好

下面是我在ec2图像生成器组件中添加的行

- echo "user1    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
我在
周围加了单引号,这使得/etc/sudoers格式不正确,因此无法工作

我这样替换上面的行

- |-
    echo "user1    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
参考资料:


您解决了这个问题吗@这是一个更好、更一般的答案:)
- |-
    echo "user1    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers