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

Unable to set environment variables for use in ansible roles

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

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

我需要在 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'\n\nThe error appears to be in '/Users/testu/ansible/ansible-team/team_deploy/roles/prereq1_setup/tasks/main.yaml': line 57, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n      - name: \"Validate kubeconfig set?\"\n        ^ here\n"}

Any hint how to set env variables so they are available for all roles inside a playbook?

您使用的机制是正确的,环境变量设置正确,但它是在 环境 中设置的,而不是在 ansible 中设置的事实。这些事实是在剧本启动之前收集的,因此您的 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:`