For the last few days I have been working on updating my Consul deployment to run on Ubuntu 18.04 instead of an AmazonLinux instance. The migration was fairly straight forward, but I ran into two small issues that I figured that I would share here.
The first issue was around updating my startup script from System V style init script to a systemd style script. My first pass of the script seemed to work ok, but there were a few things wrong with it.
[generic]
[Unit]
Description=Consul
Documentation=https://www.consul.io/
[Service]
LimitNOFILE=1024
ExecStart=/opt/consul/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
[/generic]
The biggest problem with the startup file was that it ran the consul process as root. It also had a little bit of an issue with the node name. After a little trial and error, I was finally able to come up with a script that would start it up as the proper user and set the node name properly.
[generic]
[Unit]
Description=Consul
Documentation=https://www.consul.io/
[Service]
PermissionsStartOnly=true
User=consul
Group=consul
LimitNOFILE=1024
ExecStartPre=/bin/bash -c “/bin/systemctl set-environment HOSTNAME=$(hostname)”
ExecStart=/opt/consul/bin/consul agent -node $HOSTNAME -config-dir=/etc/consul.d/
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
[/generic]
The next issue was around the sending autoscaling the signal to the stack that the machines are up. The Canonical provided instances does not have the cfn-bootstrap helper apps, so my original UserData was not able to send the signal causing my CloudFormation to fail.
[shell]
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
/usr/local/bin/cfn-signal -e 0 –stack ${AWS::StackName} –resource ConsulASG –region ${AWS::Region}
[/shell]
Getting it to work was really easy. All I needed to do was install the bootstrap tools first. Thankfully, it was as easy as adding a line to UserData to run a pip command first.
[shell]
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
sudo pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
/usr/local/bin/cfn-signal -e 0 –stack ${AWS::StackName} –resource ConsulASG –region ${AWS::Region}
[/shell]
That’s it. My CloudFormation template successfully builds my cluster in AWS. I’ve also update my Ansible Galaxy Role for Consul with the new startup script.
Comments