You encounter an error during Apply Changes and BOSH is not able to render the template alertmanager.yml.erb.
When configuring alerts for Healthwatch 2.x, you encounter an error like the one below during an Apply Changes:
Task 13591 | 06:39:00 | Preparing deployment: Rendering templates (00:00:14) L Error: Unable to render instance groups for deployment. Errors are: - Unable to render jobs for instance group 'tsdb'. Errors are: - Unable to render templates for job 'alertmanager'. Errors are: Exit code 1 - Error filling in template 'alertmanager.yml.erb' (line 119: (): did not find expected key while parsing a block mapping at line 2 column 3) Task 13591 | 06:39:14 | Error: Unable to render instance groups for deployment. Errors are: - Unable to render jobs for instance group 'tsdb'. Errors are: - Unable to render templates for job 'alertmanager'. Errors are: - Error filling in template 'alertmanager.yml.erb' (line 119: (): did not find expected key while parsing a block mapping at line 2 column 3)
The cause of this issue is that the YAML configuration is not formatted correctly. The alertmanager.yml.erb template is used to generate the Alert Manager configuration. This template is using ruby YAML.load to reformat the configuration. Given that the YAML is not valid, the `YAML.load` fails.
111 global:
112 <%= route = p('routes')
113 route_yaml = {}
114 if route.empty?
115 route_yaml["route"]= {}
116 route_yaml["route"]["routes"]= nil
117 route_yaml["route"]["receiver"]= "default-receiver"
118 else
119 base_route_yaml = YAML.load(route)
120
121 if base_route_yaml.has_key?("route")
122 route_yaml = base_route_yaml
123 else
124 route_yaml["route"] = base_route_yaml
125 end
126
127 end
128 YAML.dump(route_yaml).sub("---\n", "")
129 %>
You should validate the correctness of the YAML using a validator.
# ruby $ ruby -ryaml -e "p YAML.load(STDIN.read)" < data.yaml # python 2 $ python -c 'import yaml, sys; yaml.safe_load(sys.stdin)' < data.yaml # python 3 $ python3 -c 'import yaml, sys, pprint; pprint.pprint(yaml.safe_load(sys.stdin))' < data.yaml # Docker and yamllint $ docker run --rm -v :/yaml sdesbure/yamllint yamllint data.yaml