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

Ansible 无法访问任务中的寄存器变量,ansible,ansible-2.x,Ansible,Ansible 2.x,我正在使用Ansible 2.4创建剧本。但是,我的一个任务中遇到了服务器未定义错误,我不确定如何解决该问题 我在playbook.yml中有一个任务,在digital ocean上启动一个服务器。我创建了一个名为server的变量,其中包含响应 - hosts: localhost tasks: - name: Spinning up a new droplet digital_ocean: state: present command: droplet

我正在使用Ansible 2.4创建剧本。但是,我的一个任务中遇到了服务器未定义错误,我不确定如何解决该问题

我在playbook.yml中有一个任务,在digital ocean上启动一个服务器。我创建了一个名为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
如果我尝试访问playbook中的服务器,它将正常工作。但是,如果我试图访问包含它的任务中的变量,则报告服务器是未定义的。我使用角色来分隔我的任务/处理者等

目录结构为:

/
  - 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
---
  - 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
在roles/node servers/tasks/main.yml中,我有以下内容:

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

  roles:
    - node-servers

  handlers:
    - name: Restarting haproxy
      service:
        name: haproxy
        state: restarted
---
  - 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
服务器返回为未定义

如何从roles/node servers/tasks/main.yml中访问服务器?

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

如果要访问本例中组节点服务器的另一台主机的变量,必须使用hostvars:


在这种情况下,您需要将新创建的服务器添加到您的资源清册中。您可以使用add_主机模块执行此操作,请参见

现在,您可以通过引用节点服务器组来配置服务器

并在您的角色中访问您的液滴详细信息:

---
- debug:
    var: "{{ droplet_details }}"

hostvars变量是否在任务中自动可用?例如在haproxy.yml中?还是必须在节点服务器中定义变量?在haproxy.yml中调试时,我得到了未定义的hostvars。hostvars在任何地方都可以随时使用。但它的内容取决于任务的顺序:在localhost.Works上设置var/fact foo之前,您不能访问hostvars.localhost.foo。我在做var={{hostvars}}而不是var=hostvars。嗨,埃里克,我已经做过了。我没有发布整个剧本。上面的答案解决了这个问题。好的,那么您想访问节点服务器角色中的digital_ocean模块返回的液滴详细信息,对吗?查看我的编辑,我相应地更新了答案。
---
- debug:
    var: "{{ droplet_details }}"