无法访问任务中的寄存器变量

时间:2017-06-27 12:22:55

标签: ansible ansible-2.x

我正在使用Ansible 2.4来创建一个剧本。但是,我在其中一项任务中遇到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,它将正常工作。但是,如果我尝试在我包含的任务中访问变量,则报告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

2 个答案:

答案 0 :(得分:1)

使用register时,仅为当前主机(在您的情况下为localhost)注册数据。这样,您可以在每个主机上拥有不同的值。

如果您想访问其他主机(您的案例中为node-servers组)的变量,则必须使用hostvars

{{ hostvars.localhost.server }}

Magic Variables, and How To Access Information About Other Hosts

答案 1 :(得分:0)

在这种特殊情况下,您希望将新创建的服务器添加到清单中。您可以使用add_host模块执行此操作(请参阅documentation)。

- 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

在您的角色中访问您的Droplet详细信息:

---
- debug:
    var: "{{ droplet_details }}"
相关问题