我尝试使用Ansible手册来配置EC2实例,使用Postgres进行配置,然后配置另一个EC2实例,并使用数据库服务器的IP地址在其上配置网络服务器。但是,我无法让我的网络服务器的角色看到我的Postgres服务器的地址。在数据库角色中,我可以看到我设置了一个事实,我可以使用调试语句显示该值,但当我尝试在Web服务器角色中显示时,Ansible错误输出。以下是我目前使用的文物:
主要剧本:
---
- name: provision machines
hosts: local
connection: local
gather_facts: False
roles:
- { role: ec2, instance_type: 'm3.large', application: 'postgres' }
- name: provision machines
hosts: postgres
sudo: yes
roles:
- { role: postgres }
- name: provision machines
hosts: local
connection: local
gather_facts: False
roles:
- { role: ec2, instance_type: 't2.micro', application: 'webserver' }
- name: Install and configure Engage
hosts: webserver
sudo: yes
roles:
- { role: webserver }
角色/ postgres的/任务/ main.yml:
---
- debug: msg="{{ hostvars.localhost.ec2.instances[0].private_ip }}"
- name: capture Postgres IP address
set_fact:
postgres_ip: "{{ hostvars.localhost.ec2.instances[0].private_ip }}"
- debug: msg="The postgres IP address is {{ postgres_ip }}"
角色/网络服务器/任务/ main.yml:
---
- debug: msg="{{ postgres_ip }}"
输出显示事实是使用Postgres角色设置了#34;
TASK: [postgres | debug msg="The postgres IP address is not-set"] *************
ok: [54.174.93.155] => {
"msg": "The postgres IP address is 172.31.10.196"
}
但是,在Web服务器角色中,值未定义。
TASK: [engage | debug msg="{{ postgres_ip }}"] ********************************
fatal: [54.172.192.12] => One or more undefined variables: 'postgres_ip' is undefined
FATAL: all hosts have already failed -- aborting
这是我在定义" postgres_ip"的方式/地点的问题吗?或者有更好的方法从一个角色中捕获一个值并在另一个角色中使用它吗?
答案 0 :(得分:0)
我的方法是将新主机添加到主要剧本中的新组,然后使用角色或其他命令对该组进行游戏
例如:
---
- hosts: localhost
# - create host here
# - register result as createdhosts
- name: add host to inventory
add_host: name={{ item.private_ip }} groups=newinstances
with_items: createdhosts.instances
- hosts: newinstances
# - do whatever with those hosts here...
希望这是你正在寻找的东西 - 除了将数据写入文件然后再读取它(丑陋,但也有效)之外,我不知道如何在多个游戏中保留变量。 / p>