Home > Enterprise >  Passing YAML content to a command in a bash function
Passing YAML content to a command in a bash function

Time:10-20

I'm currently writing a bash script and struggling with something that looked fairly simple at first.

I'm trying to create a function that calls a kubectl (Kubernetes) command. The command is expecting the path to a file as an argument although I'd like to pass the content itself (multiline YAML text). It works in the shell but can't make it work in my function. I've tried many things and the latest looks like that (it's just a subset of the the YAML content):

#!/bin/bash

AGENT_NAME="default"

deploy_agent_statefulset() {
   kubectl apply -n default -f - $(cat <<- END
   kind: ConfigMap
   metadata:
   name: $AGENT_NAME
   apiVersion: v1
   data:
   agent.yaml: |    
      metrics:
         wal_directory: /var/lib/agent/wal
   END
   )
}

deploy_agent_statefulset

The initial command that works in the shell is the following.

cat <<'EOF' | NAMESPACE=default /bin/sh -c 'kubectl apply -n $NAMESPACE -f -'

kind: ConfigMap
...

I'm sure I m doing a lot of things wrong - keen to get some help

Thank you. name: grafana-agent

CodePudding user response:

You can do something like this; note that here only one argument is passed to the echo command in double quotes to preserve the newlines and indentation.

deploy_agent_statefulset() {
   echo "---
   kind: ConfigMap
   metadata:
     name: $AGENT_NAME
   apiVersion: v1
   data:
     agent.yaml: |    
       metrics:
         wal_directory: /var/lib/agent/wal" |kubectl apply -n default -f  -
}

CodePudding user response:

In your function, you didn't contruct stdin properly :

#!/bin/bash

AGENT_NAME="default"

deploy_agent_statefulset() {
   kubectl apply -n default -f - <<END
kind: ConfigMap
metadata:
name: $AGENT_NAME
apiVersion: v1
data:
agent.yaml: |    
   metrics:
      wal_directory: /var/lib/agent/wal
END
}

deploy_agent_statefulset
  • Related