How do I redirect Ansible to use files in a role directory?

7/2/2021

Salutations, I am deploying pods/applications to EKS via Ansible. My playbook runs a few kubectl apply -f commands in order to deploy EKS resources and all of the .yaml files are in that directory.

I would like to place these .yaml files that create each application in it's own ansible role/files directory in order to clean up the main ansible directory a bit (the .yaml files are becoming overwhelming and I only have two applications being deployed thus far).

The issue is this: When I move the .yaml files to it's respective /roles/files directory ansible still seems to look for the files in the main ansible directory instead of scanning the internal role directory.

How do I redirect Ansible to run the shell commands on .yamls in the role's file directory? Playbook below:

#
# Deploying Jenkins to AWS EKS
#
# Create Jenkins Namespace
- name: Create Jenkins Namespace & set it to default
  shell: |
    kubectl create namespace jenkins
    kubectl config set-context --current --namespace=jenkins
# Create Jenkins Service Account
- name: Create Jenkins Service Account
  shell: |
    kubectl create serviceaccount jenkins-master -n jenkins
    kubectl get secret $(kubectl get sa jenkins-master -n jenkins -o jsonpath={.secrets[0].name}) -n jenkins -o jsonpath={.data.'ca\.crt'} | base64 --decode
# Deploy Jenkins
- name: Deploy Jenkins Application
  shell: | 
    kubectl apply -f jenkins-service.yaml
    kubectl apply -f jenkins-vol.yaml
    kubectl apply -f jenkins-role.yaml
    kubectl apply -f jenkins-configmap.yaml
    kubectl apply -f jenkins-deployment.yaml

Below is the role directory structure, Ansible doesn't check this location for the yaml files to run in the playbook above. This is the directory structure

-- BoyArmy_89
ansible
infrastructure-as-code
kubernetes

1 Answer

7/2/2021

You could use the role_path variable, which contains the path to the currently executing role. You could write your tasks like:

- name: Deploy Jenkins Application
  shell: | 
    kubectl apply -f {{ role_path }}/files/jenkins-service.yaml
    kubectl apply -f {{ role_path }}/files/jenkins-vol.yaml
    ...

Alternately, a fileglob lookup might be easier:

- name: Deploy Jenkins Application
  command: kubectl apply -f {{ item }}
  loop: "{{ query('fileglob', '*.yaml') }}"

This would loop over all the *.yaml files in your role's files directory.

You could consider replacing your use of kubectl with the k8s module.

Lastly, rather than managing these resources using Ansible, you could consider using kustomize, which I have found to be easier to work with unless you're relying heavily on Ansible templating.

-- larsks
Source: StackOverflow