无法设置用于 ansible 角色的环境变量



当我在一个没有角色的剧本中定义了环境变量和任务时,我的剧本运行良好。

但是,当我将项目构建为角色时,我发现运行任务找不到从原始剧本中设置的环境变量。
任何提示如何设置 env 变量,以便它们可用于剧本中的所有角色?

我需要tasks/main.yaml文件中指定环境变量吗?如果是,应该如何做到这一点?

cat playbook.yaml 
-
name: Deploy Team Services Playbook
hosts: all
environment:
PATH: "{{ ansible_env.PATH }}:/usr/local/bin"
KUBECONFIG: "{{ ansible_env.HOME }}/.kube/config/{{ ansible_env.USER }}.kubeconfig"
roles:
- prereq1_setup
- prereq2_k8s

prereq1_setup\tasks\main.yaml

- name: "Validate kubeconfig set?"
shell: echo {{ ansible_env.KUBECONFIG }}
failed_when: "'KUBECONFIG' not in ansible_env"

如果我不使用角色并直接在下面添加任务,则上面有效。 目前,出现错误

输出:

|TASK [prereq1_setup : Validate kubeconfig set?] *****************************************************
fatal: [target1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'KUBECONFIG'nnThe error appears to be in '/Users/testu/ansible/ansible-team/team_deploy/roles/prereq1_setup/tasks/main.yaml': line 57, column 9, but maynbe elsewhere in the file depending on the exact syntax problem.nnThe offending line appears to be:nnn      - name: "Validate kubeconfig set?"n        ^ heren"}

任何提示如何设置 env 变量,以便它们可用于剧本中的所有角色?

您使用的机制是正确的,并且该环境变量正在正确设置,但它是在环境中设置的,而不是在可识别的事实中设置的。这些事实是在剧本启动之前收集的,因此你的environment:发生在事实收集之后,这就解释了为什么ansible_env不包含它

您有几条前进的道路,具体取决于您的偏好:

在剧本
  • 中显式重新收集事实(甚至将剧本更改为gather_facts: no并手动调用setup:(
  • 停止在ansible_env中寻找环境,相信它确实存在,只使用需要环境变量的命令
  • 显式声明一个单独的事实,以使该变量可用于environment:和 ansible 任务

如果你想要第一个,它看起来像:

-
name: Deploy Team Services Playbook
hosts: all
gather_facts: no
environment:
whatever: goes here
pre_tasks:
- setup:
roles:
- and so forth

您可以通过以下方式确认第二个:

- name: ensure $KUBECONFIG is set
shell: echo $KUBECONFIG

第三个看起来像:

- hosts: all
environment:
alpha: beta
vars:
alpha: beta
roles:
- # now {{ alpha }} is available to ansible and as $alpha in `commands:`

相关内容

  • 没有找到相关文章

最新更新