YAML Considered Harmful

A presentation at DevOpsDays Copenhagen 2019 in April 2019 in Copenhagen, Denmark by Philipp Krenn

Slide 1

Slide 1

YAML Considered Harmful Philipp Krenn @xeraa

Slide 2

Slide 2

https://homepages.cwi.nl/~storm/teaching/reader/ Dijkstra68.pdf

Slide 3

Slide 3

Why YAML? Human readable Comments

Slide 4

Slide 4

Whitespace Sensitive It depends

Slide 5

Slide 5

Issues http://www.yamllint.com ports: - 80:80 - 20:20

Slide 6

Slide 6

Issues https://docs.docker.com/compose/compose-file/ #short-syntax-1 ports: - “80:80” - 73200

Slide 7

Slide 7

Issues countries: - DE - FR - GB - IE - NO - PT

Slide 8

Slide 8

Issues firstname: Philipp surname: Null

Slide 9

Slide 9

Issues windows_drive: c: version: 1.0

Slide 10

Slide 10

Abuse Behavior instead of data

Slide 11

Slide 11

Gitlab Deploying itself in 1,100+ lines https://gitlab.com/gitlab-org/gitlab-ce/blob/ master/.gitlab-ci.yml

Slide 12

Slide 12

package-and-qa: image: ruby:2.5-alpine stage: test before_script: [] dependencies: [] cache: {} variables: GIT_DEPTH: “1” API_TOKEN: “${GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN}” retry: 0 script: - apk add —update openssl curl jq - gem install gitlab —no-document - source ./scripts/review_apps/review-apps.sh - wait_for_job_to_be_done “gitlab:assets:compile” - ./scripts/trigger-build omnibus when: manual only: - /.+/@gitlab-org/gitlab-ce - /.+/@gitlab-org/gitlab-ee

Slide 13

Slide 13

https://gitlab.com/gitlab-org/gitlab-ce/blob/master/ scripts/review_apps/review-apps.sh: 400 lines function previousDeployFailed() { set +e local deploy=”${1}” echoinfo “Checking for previous deployment of ${deploy}” true helm status ${deploy} >/dev/null 2>&1 local status=$? # if status is 0, deployment exists, has a status if [ $status -eq 0 ]; then echoinfo “Previous deployment found, checking status…” deployment_status=$(helm status ${deploy} | grep ^STATUS | cut -d’ ’ -f2) echoinfo “Previous deployment state: ${deployment_status}” if [[ “$deployment_status” == “FAILED” || “$deployment_status” == “PENDING_UPGRADE” || “$deployment_status” == “PENDING_INSTALL” ]]; then status=0; else status=1; fi else echoerr “Previous deployment NOT found.” fi set -e return $status }

Slide 14

Slide 14

Helm Templates apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: {{- include “mychart.app” . | nindent 4 }} data: myvalue: “Hello World” {{- range $key, $val := .Values.favorite }} {{ $key }}: {{ $val | quote }} {{- end }} {{- include “mychart.app” . | nindent 2 }}

Slide 15

Slide 15

If you want a DSL, use a DSL

Slide 16

Slide 16

Alternative: XML <?xml version=”1.0” encoding=”UTF-8” ?> <!—Last modified 1 April 2001 by John Doe—> <title>XML Example</title> <owner> <name>John Doe</name> </owner> <database> <server>192.168.1.1</server> <ports> <port>8001</port> <port>8002</port> <port>8003</port> </ports> </database> <servers> <server name=”alpha”> <ip>10.0.0.1</ip> <dc>eqdc10</dc> </server> <server name=”beta”> <ip>10.0.0.2</ip> <dc>eqdc10</dc> </server> </servers>

Slide 17

Slide 17

Alternative: JSON { “_comment”: “Last modified 1 April 2001 by John Doe”, “title”: “JSON Example”, “owner”: { “name”: “John Doe” }, “database”: { “server”: “192.168.1.1”, “ports”: [ 8001, 8002, 8003 ] }, “servers”: { “alpha”: { “ip”: “10.0.0.1”, “dc”: “eqdc10” }, “beta”: { “ip”: “10.0.0.2”, “dc”: “eqdc10” } } }

Slide 18

Slide 18

Alternative: INI ; Last modified 1 April 2001 by John Doe [owner] name=John Doe organization=Acme Widgets Inc. [database] ; use IP address in case network name resolution is not working server=192.168.1.1 port=8001 [servers] serverAlphaIp=10.0.0.1 serverAlphaDc=eqdc10 serverBetaIp=10.0.0.2 serverBetaDc=eqdc10

Slide 19

Slide 19

Alternative: TOML # Last modified 1 April 2001 by John Doe title = “TOML Example” [owner] name = “John Doe” dob = 1970-01-01T01:00:00-02:00 # First class dates [database] server = “192.168.1.1” ports = [ 8001, 8002, 8003 ] [servers] [servers.alpha] ip = “10.0.0.1” dc = “eqdc10” [servers.beta] ip = “10.0.0.2” dc = “eqdc10”

Slide 20

Slide 20

YAML Considered Harmful Philipp Krenn @xeraa