The aws ssm agent is very useful when working both with EC2 instances and with machinery outside AWS. Once you add an outside instance by installing and configuring the SSM agent, be it on-premises or a VM at another provider, you can tag it for further granularity with aws ssm add-tags-to-resource --resource-type ManagedInstance --resource-id mi-WXYZWXYZ --tags Key=onpremise,Value=true --region eu-west-1
where mi-WXYZWXYZ
is the instance ID you see at the SSM’s managed instances list (alternatively you can get this list with aws ssm describe-instance-information
along with lots of other information).
It may the case that sometimes you want to apply with ansible a certain change to those machines that live outside AWS. Yes you can run ansible workbooks via the SSM directly, but this requires ansible installed on said machines. If you need the simplest of dynamic inventories, to $ ansible -u user -i ./lala all -m ping
here is the crudest version of ./lala
, one that happily ignores the --list
argument:
#!/bin/bash printf "%s%s%s" \ '{ "all": { "hosts": [' \ $(aws ssm describe-instance-information --region eu-west-1 --filter Key=tag:onpremise,Values=true --query "InstanceInformationList[].IPAddress" --output text | tr '[:blank:]' ',') \ '] } }'
You can go all the way scripting something like this for a proper solution though.
Why printf
instead of echo
above? Because jpmens suggested so.