В настоящее время я настраиваю несколько ролей Ansible для настройки кластера Kubernetes. До сих пор у меня была роль обеспечения идемпотентных EC2 (1x Master / 2x Worker) и последующих ролей для настройки этих главных / рабочих узлов с зависимостями Docker / Kubernetes. Я использую AWS ec2.ini/.py dynamic-inventory
для обнаружения IP-адресов экземпляров, предоставленных моей ролью create_ec2
.
Я столкнулся с проблемой при попытке присоединить моих работников к кластеру с помощью команды соединения, которую я получаю с главного узла. У меня есть 2 отдельные роли для подготовки главного и рабочего. В задачах для мастера я получаю команду соединения с:
kubeadm token create --print-join-command
и затем зарегистрируйте переменную, которую я затем использую для установки факта хоста:
set_fact:
join_command: "{{ join_command_stdout.stdout_lines[0] }}"
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь получить доступ к этому факту на своих рабочих узлах при выполнении моей рабочей роли. Я пытаюсь получить доступ к факту с помощью:
"{{ hostvars['tag_Type_master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
Однако это происходит сбой, так как хост, который я предоставляю для хостов, явно не определен ..
Для справки, у меня есть это значение в моем динамическом инвентаре (IP опущен):
"tag_Type_master": [
"1.2.3.4"
Я получаю ошибку:
"{"msg": "The task includes an option with an undefined variable. The error was: \"hostvars['tag_Type_master']\" is undefined"
Я изо всех сил пытаюсь выяснить, как я получаю доступ к фактам хоста экземпляра EC2, определенного в моем динамическом инвентаре.
Я попытался добавить IP EC2 непосредственно в hostvars (hostvars['1.2.3.4'].join_command
), однако задача просто зависает и ничего не делает.
Я также пытался вставить переменную Magic (hostvars['inventory_hostname].join_command
) безрезультатно.
Похоже, что людям удалось получить доступ к фактам хоста с хостов, определенных в статическом файле инвентаризации, однако из-за динамической природы серверов EC2 будет создан кластер, я не могу использовать этот подход.
run.yml:
name: Setup K8s master node
hosts: tag_Name_kube_master
gather_facts: true
roles:
- setup_kube_master
name: Setup K8s worker nodes
hosts: tag_Name_kube_worker
gather_facts: true
roles:
- setup_kube_worker
setup_kube_master / задачи / set_fact.yml:
name: Get join command for workers
shell: kubeadm token create --print-join-command
register: join_command_stdout
name: Persist variable for workers
set_fact:
join_command: "{{ join_command_stdout.stdout_lines[0] }}"
setup_kube_worker / задачи / get_fact.yml:
name: join cluster
shell: "{{ hostvars['tag_Type_master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
args:
chdir: $HOME
creates: node_joined.txt