Skip to content

Передача данных, переменных между хостами в 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, вы можете эффективно управлять данными и ресурсами вашей инфраструктуры, делая вашу автоматизацию еще более гибкой и мощной.