Передача данных, переменных между хостами в Ansible¶
В среде автоматизации инфраструктуры Ansible часто возникает необходимость передачи переменных между различными хостами или даже в пределах одного плейбука. Это может быть полезно, когда требуется выполнить действия на одном хосте на основе данных, полученных с другого хоста. В данной статье мы рассмотрим несколько методов передачи переменных в Ansible и примеры их использования.
1. Копирование файла на хост из Ansible плейбука с помощью local_action:¶
Этот метод позволяет копировать файл с локальной машины на удаленный хост. Например, мы можем создать файл с командой для присоединения к кластеру Kubernetes и скопировать его на рабочий узел для выполнения.
master playbook
---
- name: Master Role
hosts: master
roles:
- master-role
---
master-role.yml:
- name: Copy join command to local file # создаем локальный файл и добавляем туда переменную для присоединения ноды
local_action: copy content="{{ join_command.stdout_lines[0] }}" dest="./join-command"
worker playbook
---
- name: Worker Role
hosts: worker
roles:
- worker-role
---
worker-role.yml
- name: Copy the join command to server location # копируем файл с нашей комадной для присоединения ноды на сервер, меняем расширение и добавляем права на исполнение
copy: src=join-command dest=/tmp/join-command.sh mode=0777
- name: Join the node to cluster # запускаем наш файл
command: sh /tmp/join-command.sh
2. Передача переменных только в рамках одного плейбука с помощью set_fact¶
С использованием этого метода мы можем установить переменную факта на основе выполнения команды на хосте и затем использовать эту переменную в рамках того же плейбука.
- hosts: master
tasks:
- name: get join command
shell: kubeadm token create --print-join-command
register: join_command_raw
- name: set join command
set_fact:
join_command: "{{ join_command_raw.stdout_lines[0] }}"
- hosts: workers
tasks:
- name: TCP port 6443 on master is reachable from worker
wait_for: "host={{ hostvars['k8s-master-1']['ansible_default_ipv4']['address'] }} port=6443 timeout=1"
- name: join cluster
shell: "{{ hostvars['k8s-master-1'].join_command }} >> node_joined.log"
args:
chdir: /home/ubuntu
creates: node_joined.log
3. Передача переменных между хостами с помощью delegate_to¶
Этот метод позволяет делегировать выполнение задачи определенному хосту и получить результат выполнения этой задачи для дальнейшего использования.
---
#inventory
[control_planes]
cp1 ansible_host=c1-cp1.lab
[nodes]
node1 ansible_host=c1-node1.lab
---
#nodes.yml
- hosts: nodes
roles:
- roles/nodes
---
#roles/nodes/main.yml
- name: generate join command
shell: kubeadm token create --print-join-command
register: kubeadm_join_cmd
delegate_to: "{{ groups['control_planes'][0] }}"
- set_fact:
kubeadm_join: "{{ kubeadm_join_cmd.stdout }}"
- name: join worker node to cluster
shell: "{{ kubeadm_join }}"
become: true
4. Передача переменных между хостами с использованием add_host¶
Этот метод позволяет добавить переменные к хосту, который не фактически существует, и затем получить доступ к этим переменным с другого хоста.
---
#first-playbook.yml
- name: Setup Vpn clients
hosts: workers
tasks:
- name: add variables to dummy host
add_host:
name: "variable_holder"
myvar: "{{ myvar }}"
---
#second-playbook.yml
- name: Setup Vpn master
hosts: master
tasks:
- name: print
debug:
var: hostvars['variable_holder'][ 'myvar' ]
---
#main playbook
-- import first-playbook.yml
-- import second-playbook.yml
Используя эти методы передачи переменных между хостами в Ansible, вы можете эффективно управлять данными и ресурсами вашей инфраструктуры, делая вашу автоматизацию еще более гибкой и мощной.