user2798561
user2798561

Reputation: 99

How to collect a grep and use it in a aws configset

In my aws Cloud Formation cfn configset I have a command to set an environment key to the name of the user group apache belongs to as it might be apache or www-data depending on the distro.

Something like this:

Metadata:
  AWS::CloudFormation::Init:
    configSets:
      joomla:
        - "set_permissions"
        - "and_some_more..."

    configure_cfn:
      files:
        /etc/cfn/hooks.d/cfn-auto-reloader.conf:
          content: !Sub |
            [cfn-auto-reloader-hook]
            triggers=post.update
            path=Resources.EC2.Metadata.AWS::CloudFormation::Init
            action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2 --configsets joomla --region ${AWS::Region}
          mode: "000400"
          owner: root
          group: root

.....

    set_permissions:  
      commands:
        01_01_get_WebServerGroup:
          env:
          #webserver group might be apache or www-data depending on the distro
            WebServerGp: 
              command: "ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'"

However, when I launch this stack, the configsets process halts at this point and I get an an error in the cfn_init.log that looks like this:

File "/usr/lib/python2.7/dist-packages/cfnbootstrap/command_tool.py", line 80, in apply raise ToolError(u"%s does not specify the 'command' attribute, which is required" % name) ToolError: 01_01_get_WebServerGroup does not specify the 'command' attribute, which is required

Is this the preferred method to catch and use a grep result in a configset command? Is there a better way? What can I do to address the error thrown in the cfn_init.log?

OK, I guess I can create parameter and mapping elements to capture the distro type on launch and then set the webserver group accordingly but I am really trying to understand how to set the env: key to a response from the cli.

Upvotes: 0

Views: 326

Answers (1)

sin
sin

Reputation: 302

The problem of your code is this line WebServerGp.

Line command is must be on the same level of env, under the commands name, in your case is 01_01_get_WebServerGroup. So, it has to be like this:

commands:
    01_01_get_WebServerGroup:
      env: ..
      command: ..

If you want to use the result of grep, you can put them on variable and use it later. You can specify more than one command under that command line using \n for executing the command.

Please check this code below.

command: "result=(ps ef | grep ...)\n echo $result\n ..."

If you have really long command, you can use the Fn::Join to be the value of command.

Upvotes: 1

Related Questions