#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