首页 > 解决方案 > 如何重定向 Ansible 以使用角色目录中的文件?

问题描述

致敬,我正在通过 Ansible 将 pod/应用程序部署到 EKS。我的剧本运行一些kubectl apply -f命令来部署 EKS 资源,所有 .yaml 文件都在该目录中。

我想将这些创建每个应用程序的 .yaml 文件放在它自己的ansible 角色/文件目录中,以便稍微清理主 ansible 目录(.yaml 文件变得不堪重负,到目前为止我只部署了两个应用程序)。

问题是这样的:当我将 .yaml 文件移动到其各自的/roles/files目录时,ansible 似乎仍然在主 ansible 目录中查找文件,而不是扫描内部角色目录。

如何重定向 Ansible 以在角色文件目录中的 .yamls 上运行 shell 命令?剧本如下:

#
# 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

下面是角色目录结构,Ansible 不会检查此位置以在上面的剧本中运行 yaml 文件。 这是目录结构

标签: kubernetesansibleinfrastructure-as-code

解决方案


您可以使用role_path包含当前执行角色的路径的变量。你可以这样写你的任务:

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

或者,fileglob查找可能更容易:

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

这将遍历*.yaml您角色files 目录中的所有文件。

您可以考虑将您的使用替换kubectlk8s 模块

最后,您可以考虑使用kustomize ,而不是使用 Ansible 管理这些资源,我发现它更容易使用,除非您严重依赖 Ansible 模板。


推荐阅读