无法设置环境变量以用于 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:`
当我在一个没有角色的剧本中定义了环境变量和任务时,我的剧本 运行 很好。
但是当我将我的项目组织成角色时,我发现 运行 任务没有找到从原始剧本中设置的环境变量。
任何提示如何设置环境变量以便它们可用于剧本中的所有角色?
我需要在 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:`