Как я могу установить переменную окружения внутри сборника пьес, а затем использовать ее внутри поиска?

#ansible

#ansible

Вопрос:

Я работаю с. community.kubernetes.k8s Когда я использую модуль, я могу установить K8S_AUTH_KUBECONFIG в качестве переменной окружения внутри моего сборника пьес, и это соблюдается модулем. Однако, когда я использую k8s поиск, переменная среды недоступна внутри поиска. Исходя из документации, такое поведение ожидается.

С помощью этого:

 - name: "My Playbook"
  environment:
    K8S_AUTH_KUBECONFIG: "{{ lookup('env', 'HOME') }}/cluster_config/kube_config.yaml"
  hosts: localhost
  connection: local
  tasks:
 

При этом выводится пустая строка:

     - name: Look up environment variable
      debug: msg="{{ lookup('env', 'K8S_AUTH_KUBECONFIG') }}"
 

Это не удается из-за этой пустой строки:

     - name: Look for a namespace
      set_fact:
        namespace: >
          {{ lookup('community.kubernetes.k8s', 
                    api_version='v1', 
                    kind='Namespace', 
                    name='myNamespace') }}
 

Это работает, как и ожидалось, потому что переменная среды доступна для модуля:

     - name: Create a namespace
      community.kubernetes.k8s:
        state: present
        resource_definition:
          apiVersion: v1
          kind: Namespace
          metadata:
            name: "{{ item }}"
 

Мне интересно, есть ли способ объявить переменную окружения внутри моего сборника пьес и сделать ее доступной из поиска? Я не хочу устанавливать это в своем bashrc или что-то в этом роде, потому что мне нужны разные настройки для разных ситуаций.

В качестве альтернативы, как бы вы предложили ввести это значение в поисковые запросы?

Обратите внимание, что k8s поиск принимает kubeconfig в качестве аргумента, аналогичного K8S_AUTH_KUBECONFIG заданию в качестве переменной среды. Есть ли у меня способ передать переменную в kubeconfig аргумент, подобный этому?

     - name: Look for a namespace
      set_fact:
        namespace: >
          {{ lookup('community.kubernetes.k8s', 
                    kubeconfig={{ my_kube_config }}, 
                    api_version='v1', 
                    kind='Namespace', 
                    name='myNamespace') }}
 

Комментарии:

1. (а) ничто не мешает вам устанавливать vars: { my_kube_config: "..." } одновременно с тем, что вы устанавливаете environment: в своем сборнике пьес (б) эти environment: значения присутствуют, в vars.environment которых list[dict] , по-видимому, так: kubeconfig={{ environment | selectattr("K8S_AUTH_KUBECONFIG") | map(attribute="K8S_AUTH_KUBECONFIG") | first }} если вы просто хотели, чтобы среда: как источник истины

Ответ №1:

Цитирую официальную документацию «Ключевое слово environment: не влияет на сам Ansible, параметры конфигурации Ansible, среду для других пользователей или выполнение других плагинов, таких как поиск и фильтры»

 - name: "My Playbook"
  environment:
    K8S_AUTH_KUBECONFIG: "{{ lookup('env', 'HOME') }}/cluster_config/kube_config.yaml"
  hosts: localhost
  connection: local
  tasks:

    - shell: echo $K8S_AUTH_KUBECONFIG
      register: kubeconfig

    - name: Look up environment variable
      debug: msg="{{ kubeconfig.stdout }}"
 

Приведенный выше сборник воспроизведения приведет к следующему выводу:

 PLAY [My Playbook] **************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [localhost]

TASK [shell] ********************************************************************************************************************************************************
changed: [localhost]

TASK [Look up environment variable] *********************************************************************************************************************************
ok: [localhost] => {
    "msg": "/home/ps/cluster_config/kube_config.yaml"
}

PLAY RECAP **********************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0