无法访问任务中的注册变量



我正在使用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返回为未定义。

如何从roles/node-servers/tasks/main.yml中访问server

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

如果要访问另一个主机的变量(在您的情况下组node-servers(,则必须使用hostvars

{{ hostvars.localhost.server }}

魔术变量,以及如何访问其他主机的信息

在这种特殊情况下,您想将新创建的服务器添加到库存中。您可以使用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 }}"

最新更新