Невозможно установить переменные среды для использования в заданных ролях - PullRequest
0 голосов
/ 07 октября 2019

У меня нормально работает playbook, когда переменные среды и задачи определены в одной книге без ролей.

Но когда я структурирую свой проект по ролям, я вижу, что выполняющиеся задачи не находят переменные среды, заданные в исходной пьесе.
Любой намек на то, как установить переменные 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'\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"}

1 Ответ

1 голос
/ 08 октября 2019

Любой намек, как установить переменные env, чтобы они были доступны для всех ролей в книге игр?

Механизм, который вы используете, является правильным, и эта переменная среды устанавливается правильно,но оно устанавливается в окружении , а не в анальных фактах . Эти факты собираются до того, как игровая книга загружается, и поэтому ваш environment: происходит после сбора фактов, что объясняет, почему ansible_env не содержит его

У вас есть несколько путей вперед, в зависимости от того, что вы предпочитаете:

  • Явным образом повторно собрать факты внутри книги игр (или даже изменить свою книгу игр на gather_facts: no и вызвать setup: вручную)
  • Прекратить искать среду в ansible_env,с уверенностью, что она действительно есть, и просто используйте команды, которым нужна переменная окружения
  • Явно объявляйте отдельный факт, чтобы сделать эту переменную доступной как для environment:, так и для заданий

Если вы хотите первый, он будет выглядеть так:

-
  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:`
...