Arhn - архитектура программирования

Невозможно получить доступ к регистровой переменной в задачах

Я использую Ansible 2.4 для создания playbook. Но у меня возникла ошибка server not defined в одной из моих задач, и я не знаю, как решить эту проблему.

У меня есть следующая задача в playbook.yml, которая запускает сервер в цифровом океане. Я создаю переменную с именем server, содержащую ответ.

- hosts: localhost
  tasks:
  - name: Spinning up a new droplet
    digital_ocean:
      state: present
      command: droplet
      name: "{{ domain }}"
      ssh_key_ids:
        - "{{ ssh_key_id }}"
      size_id: 512mb
      region_id: lon1
      image_id: debian-9-x64
      api_token: "{{ api_token }}"
      backups_enabled: no
    register: server

Если я попытаюсь получить доступ к server в playbook, он будет работать нормально. Но если я попытаюсь получить доступ к переменной в задачах, которые я включаю, она сообщает, что server не определено. Я использую роли для разделения своих задач/обработчиков и т. д.

Структура каталогов:

/
  - group_vars
    - all.yml
  - roles
    - node-servers
      - tasks
        - main.yml
        - haproxy.yml
        ...

В playbook.yml у меня есть следующее:

- hosts: node-servers
  remote_user: root
  gather_facts: false

  roles:
    - node-servers

  handlers:
    - name: Restarting haproxy
      service:
        name: haproxy
        state: restarted

В roles/node-servers/tasks/main.yml у меня есть следующее:

---
  - debug:
    var: "{{server}}"

  - name: Creating unprivileged user
    user:
      name: "{{ user }}"
      state: present
      password: "{{ user_pass }}"

  - name: Updating packages
    shell: apt-get update

  - name: Installing Required packages
    apt: name={{ item }} state=latest
    with_items:
      - build-essential
      - iptables-persistent
      - apt-transport-https
      - python-openssl

  - include: nodejs.yml
  - include: haproxy.yml
  - include: letsencrypt-dns.yml
  - include: deploy.yml
  - include: daemonize-nodeapp.yml

servers возвращается как неопределенное.

Как я могу получить доступ к server из roles/node-servers/tasks/main.yml?

27.06.2017

Ответы:


1

При использовании register данные регистрируются только для текущего хоста (в вашем случае localhost). Таким образом, вы можете иметь разные значения на каждом хосте.

Если вы хотите получить доступ к переменным другого хоста (группы node-servers в вашем случае), вы должны использовать hostvars:

{{ hostvars.localhost.server }}

Волшебные переменные и как получить доступ к информации о других хостах

27.06.2017
  • Доступна ли автоматически переменная hostvars в задачах? Например, в haproxy.yml? Или мне нужно определить переменную в node-servers? Я получаю hostvars undefined при отладке в haproxy.yml. 27.06.2017
  • hostvars доступен везде в любое время. НО его содержимое зависит от порядка задач: вы не можете получить доступ к hostvars.localhost.foo до установки var/fact foo на localhost. 27.06.2017
  • Работает сейчас. Я делал var={{ hostvars }} вместо var=hostvars. 27.06.2017

  • 2

    В этом конкретном случае вы хотите добавить вновь созданный сервер в свой инвентарь. Это можно сделать с помощью модуля add_host (см. документацию).

    - hosts: localhost
      tasks:
    
      - name: Spinning up a new droplet
        digital_ocean:
          state: present
          # ...
        register: result
    
      - add_host:
          name: "{{ result.droplet.ip_address }}"
          groups: node-servers
          droplet_details: "{{ result.droplet }}"
    

    Теперь вы можете настроить сервер, ссылаясь на группу node-servers.

    - hosts: node-servers
      remote_user: root
      gather_facts: false
    
      roles:
        - node-servers
    

    И в вашей роли получите доступ к своим данным дроплета:

    ---
    - debug:
        var: "{{ droplet_details }}"
    
    28.06.2017
  • Привет Эрик, я уже делаю это. Я не выкладывал всю пьесу. Ответ выше решил эту проблему. 28.06.2017
  • Итак, вы хотите получить доступ к сведениям о капле, возвращаемым модулем digital_ocean в роли node-servers, верно? Смотрите мои правки, я соответственно обновил ответ. 28.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..