YAML, which stands for "YAML Ain't Markup Language," is a data serialization language that was first released in 2001. It was developed by Clark Evans and Ingy döt Net, with the goal of creating a human-readable language that could be used for storing and exchanging data.
Since its inception, YAML has become a popular choice for storing configuration files and data for a wide range of applications. Its simple syntax and ability to handle a variety of data types make it easy to read and write, and it has become a common alternative to other data serialization languages such as JSON and XML.
YAML has undergone several revisions since its initial release, with the most recent version, YAML 1.2, being released in 2009. Today, it is used in a variety of applications, including cloud infrastructure, continuous integration and delivery tools, and configuration management systems.
Advantages of Using YAML
One of the main benefits of YAML is its simplicity. It uses indentation to denote structure, making it easy for humans to read and write.
These are advantages i made for you to using YAML that you may want to know:
1- Flexible: YAML can handle a wide range of data types, including strings, integers, floats, and Booleans. This makes it suitable for storing a variety of data, including simple key-value pairs and more complex data structures.
2- Easy to parse: YAML is easy for computers to parse, making it efficient to use in applications. This is especially useful when working with large data sets or when you need to parse the data quickly.
3- Compatible with other languages: YAML is compatible with a wide range of programming languages, making it easy to use in a variety of applications.
YAML files consist of a series of key-value pairs, with the key on the left and the value on the right. Keys are separated from values by a colon, and multiple key-value pairs are separated by dashes.
Here is an example of a simple YAML file:
name: Yahya age: 21 location: Cloud
As you can see, the key-value pairs are easy to read and understand.
YAML also supports arrays and lists, which can be denoted using square brackets or by using the
Here is an example of an array in YAML:
fruits: - apple - orange - banana
And here is an example of a list:
names: - Yaya-V1 - Yaya-V2 - Yaya-V3 - Yaya-Vn
Both arrays and lists are useful for storing collections of data.
In addition to basic key-value pairs and arrays, YAML also supports more advanced features such as:
Anchors, which allow you to reuse values in your YAML file
Tags, which allow you to specify the type of a value.
Aliases, which allow you to create multiple references to the same node in your YAML file. This can be useful when you want to link multiple nodes together.
These features can be useful for organizing and structuring your YAML data.
Here is an example of using anchors, tags and Aliases in YAML:
# This is an anchor - &label Color # This is a reference to an anchor colors: - value: blue - value: green - value: red # This is a tag colors: - &color1 blue - &color2 green - &color3 red # This is an alias &label Node # This is a reference to an alias nodes: - value: Node 1 - value: Node 2 - value: Node 3
The three above are advanced features of YAML that can be useful for organizing and structuring your data in a DevOps workflow. They allow you to reuse values, specify the type of a value, and link multiple nodes together, making it easier to manage and manipulate your data.
YAML & DevOps
YAML is an essential tool for DevOps professionals. Its simplicity and flexibility make it a valuable tool for automating tasks and streamlining workflows.
YAML is also often used to define cloud infrastructure, such as virtual machines, load balancers, and storage. This allows for easy management and automation of cloud resources, which is an important aspect of the DevOps philosophy.
Here are some ways that YAML can be used in a DevOps workflow:
Configuration Management: YAML is often used to store configuration data for tools like Ansible, puppet, and chef. This allows for easy management of configuration files, and it makes it easy to automate tasks such as setting up new servers or deploying applications.
Continuous Integration and Delivery: YAML is commonly used to define the steps in a continuous integration or delivery pipeline. For example, you might use YAML to define the steps for building, testing, and deploying an application. This allows for easy automation of the deployment process.
Cloud Infrastructure: YAML is often used to define cloud infrastructure, such as virtual machines, load balancers, and storage. This allows for easy management and automation of cloud resources.
Container Orchestration: YAML is commonly used to define the configuration of container orchestration tools like Kubernetes. This includes defining the container images to use, the number of replicas to run, and other configuration options.
Continuous Monitoring: YAML is often used to define the configuration for continuous monitoring tools like Prometheus. This includes defining the metrics to collect, the alert thresholds, and other configuration options.
Infrastructure as Code: YAML is commonly used in infrastructure as code tools like Terraform. These tools allow you to define your infrastructure using code, and YAML is often used as the configuration language.
Log Management: YAML is sometimes used to define the configuration for log management tools like Logstash. This includes defining the logs to collect, the filters to apply, and other configuration options.
YAML is a versatile tool that can be used in a wide range of DevOps scenarios to automate tasks, manage configuration, and streamline workflows. Let's try it out.
Create Your First Pipeline
Creating a DevOps pipeline in YAML involves defining the steps that need to be taken to build, test, and deploy your application. Here is an example of how to create a simple pipeline in YAML:
First, create a file called
pipeline.yml and define the pipeline as follows:
name: My Pipeline # Define the steps in the pipeline steps: # The build step - name: Build image: node:12 commands: - npm install - npm run build # The test step - name: Test image: node:12 commands: - npm test # The deploy step - name: Deploy image: ubuntu commands: - ssh user@server "cd /path/to/app && git pull && npm install && pm2 restart all"
This pipeline has three steps: a build step, a test step, and a deploy step. The build step installs dependencies and runs the build script, the test step runs the test suite, and the deploy step pulls the latest code from the repository and deploys it to the server.
To run the pipeline, you will need a continuous integration or delivery tool that supports YAML pipelines. For example, you could use GitLab CI/CD, Azure DevOps, or GitHub Actions.
Once you have your pipeline defined in a
pipeline.yml file and your continuous integration or delivery tool set up, you can trigger the pipeline by committing code changes to your repository. The tool will automatically run the pipeline and execute the steps defined in the
YAML & Docker
YAML is often used in conjunction with Docker, a containerization platform that allows you to package and deploy applications in a portable and lightweight format.
Here are a few ways that YAML is used with Docker:
1- Docker Compose: Docker Compose is a tool for defining and running multi-container Docker applications. You can use YAML to define the configuration for your Docker Compose application in a
docker-compose.yml file. For example:
version: '3' services: web: build: . ports: - "3000:3000" redis: image: redis:alpine
docker-compose.yml file defines two services: a web service and a redis service. The web service is built from the current directory, and the redis service uses the redis image from Docker Hub.
2- Dockerfiles: Dockerfiles are text files that contain instructions for building a Docker image. You can use YAML to define the steps in a Dockerfile using the RUN directive. For example:
FROM node:12 # Install dependencies COPY package.json . RUN npm install # Build the app COPY . . RUN npm run build # Run the app CMD ["npm", "start"]
This Dockerfile defines the steps for building a Docker image for a Node.js application. It installs dependencies, builds the app, and then runs the app.
YAML & K8S
As mentioned in my previous blog, YAML is commonly used with Kubernetes, a container orchestration platform that allows you to deploy and manage containerized applications at scale.
Here are a 2 ways that YAML is used with Kubernetes:
1- Kubernetes Objects: Kubernetes objects are the core resources that make up a Kubernetes cluster. You can use YAML to define the configuration for these objects in a
.yml file. For example:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:1.15
pod.yml file defines a Kubernetes Pod object with a single container running the nginx image.
2- Deployment Descriptors: Deployment descriptors are used to specify the desired state of a Kubernetes deployment. You can use YAML to define the configuration for a deployment descriptor in a .yml file. For example:
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: nginx:1.15
deployment.yml file defines a Kubernetes Deployment object with three replicas of the nginx image.
YAML & Ansible
YAML is also used in conjunction with Ansible, a configuration management and automation tool that allows you to deploy and manage infrastructure and applications.
Here are a few ways that YAML is used with ansible:
1- Ansible Playbooks: Ansible playbooks are files that define the tasks and configuration for an ansible playbook. You can use YAML to define the structure and syntax of an ansible playbook in a
.yml file. For example:
- name: Install and configure Apache hosts: all become: true tasks: - name: Install Apache yum: name: httpd state: present - name: Start Apache service: name: httpd state: started enabled: true
playbook.yml file defines a playbook that installs and starts Apache on all hosts.
2- Ansible Inventory: Ansible inventory is a file that defines the hosts and groups in your infrastructure. You can use YAML to define the structure and syntax of an ansible inventory in a
.yml file. For example:
all: children: webservers: hosts: web1: ansible_host: 192.0.2.10 web2: ansible_host: 192.0.2.11 databases: hosts: db1: ansible_host: 198.51.100.10
inventory.yml file defines two groups: webservers and databases. It also defines the hostnames and IP addresses for each host in these groups.
3- Define variables in ansible playbooks: You can use YAML to define variables in your ansible playbooks. This can be useful for storing and accessing data that is used throughout the playbook.
4- Define task parameters: You can use YAML to define the parameters for a task in an ansible playbook. This can be useful for specifying the options and arguments for a task.
5- Define ansible roles: Ansible roles are a way to organize and reuse ansible playbook tasks. You can use YAML to define the structure and syntax of an ansible role in a .yml file.
YAML is a critical tool for defining the configuration and syntax of ansible playbooks, inventory files, variables, task parameters, and roles. Its simplicity and flexibility make it a popular choice for defining the tasks and infrastructure in ansible
YAML has proven to be a valuable tool in the DevOps workflow due to its simplicity and flexibility. Its human-readable syntax and ability to handle a wide range of data types make it an ideal choice for storing configuration files and data.
Furthermore, as DevOps continues to evolve, it is likely that YAML will remain an important tool for automating tasks and streamlining workflows. Its compatibility with a wide range of programming languages and tools make it well-suited for use in a variety of DevOps scenarios.
A Look at YAML and Beyond
The use of YAML and other technologies is ultimately about finding the right tool for the job; The key is to understand the strengths and weaknesses of each tool and choose the one that best fits your needs.
There are always new tools and technologies being developed, and it can be overwhelming to try to keep up with them all. However, by focusing on the core principles of simplicity, flexibility, and efficiency, you can make informed decisions about which technologies to use and how to use them effectively.
the goal is to find the right balance between using the right tools for the job and not getting bogged down. By keeping this philosophy in mind, Adopt DevOps, you can streamline your workflows and focus on delivering value to your clients.
Did you find this article valuable?
Support Yahya Abulhaj by becoming a sponsor. Any amount is appreciated!