首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yaml for EC2图像生成器中的多行bash脚本

yaml for EC2图像生成器中的多行bash脚本
EN

Stack Overflow用户
提问于 2020-09-20 22:32:51
回答 2查看 962关注 0票数 3

我正在尝试创建自定义组件文档。虽然我已经使用各种yaml linter测试了yaml文件,但EC2图像构建器报告了以下错误

代码语言:javascript
复制
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文件出了什么问题

代码语言:javascript
复制
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

如果有人能帮我找出错误,我将不胜感激。目标是使用预配置的软件和设置构建AMI。

EN

回答 2

Stack Overflow用户

发布于 2021-02-10 13:07:55

因为这一行中的:,你会得到这个错误:

代码语言:javascript
复制
- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')

YAML解析器将该行解释为创建映射,而不是在现有映射中创建字符串条目。我可以在我自己的YAML中使用的一种解决方法是用单引号将:括起来,因此问题行将变成

代码语言:javascript
复制
- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost':' //')

根据我自己的使用和我使用该解决方案测试的this online YAML parser,应该可以做到这一点。

票数 1
EN

Stack Overflow用户

发布于 2021-02-15 17:55:08

尽管@micah-l-c answer在OP的案例中会有所帮助。

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

这里的错误行是

代码语言:javascript
复制
- mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')

这可以重写为

代码语言:javascript
复制
- |-
    mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')

代码语言:javascript
复制
- >-
    mysqlpass=$(sudo grep 'temporary password' /var/log/mysqld.log | sed 's/.*root@localhost: //')

现在,使用上面的方法可以很好地避开:

我遇到了一个类似的问题,我将举一个例子,其中@micah-l-c解决方案不起作用,而上面的方法起作用了。

下面是我在ec2映像构建器组件中添加的行

代码语言:javascript
复制
- echo "user1    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

我用单引号将:括起来,结果导致/etc/sudoers格式错误,因此无法正常工作。

我像这样替换上面的行

代码语言:javascript
复制
- |-
    echo "user1    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

参考文献:

How to escape indicator characters (i.e. : or - ) in YAML

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63980045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档