我正在使用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 }}"