我有一个Ansible playbook,它首先在google cloud上创建一个实例,然后将新实例加载到一个组中。然后它继续并尝试为将更新新实例设置的组运行角色。我从Ansible documentation on Google Cloud获得了大部分代码。
我真正添加的是添加vars_prompt
以获取实例名称(作为t_customername
)和添加软件席位数的var。
在我的剧本中,我使用vars_prompt
来收集一些用户输入。我在剧本中使用这些变量:
- name: Create Customer
hosts: localhost
gather_facts: no
connection: local
vars:
machine_type: n1-standard-1 # default
image: appname-cloud-base
service_account_email: myemailaccount@developer.gserviceaccount.com
credentials_file: /home/developer/ansible/appnamecloud.json
project_id: appnamecloud
vars_prompt:
- name: "t_customername"
prompt: "enter customer name"
private: no
- name: "tag"
prompt: "enter tag"
private: no
- name: "t_seats"
prompt: "enter number of simultaneous seats or -1 for unlimited."
private: no
任务: ...
初始化新实例后,我将其添加到具有add_host的组中,然后我继续开始一个新部分,我想调用一个角色并通过变量t_customname
和t_seats
这个角色。起初我认为变量会自动在角色范围内,但角色说它们是未定义的。然后我试着像这样分配它们:
- name: Manage new instances
hosts: my_instances
connection: ssh
sudo: True
roles:
- role: update
vars:
dbinstalltype: "CREATE"
customername: "{{ t_customername }}"
seats: "{{ t_seats }}"
当我尝试访问{{customername}}
{{t_customername}}
未定义时,Ansible会在该角色中出错。
我通过尝试在sudo: True
行下面的上一部分中进行调试来进一步测试,并且它显示t_customername
和t_seats
在那里也是未定义的。我也尝试在第一个代码部分调用set_fact来查看是否有帮助,但在第二个代码部分中这些变量也未定义。
是否因为我构建我的两个名字部分的方式?如何将vars_prompt
变量传递给下一部分/角色?
这是我的full file。
答案 0 :(得分:0)
在add_host
任务中定义变量,而不是在后续游戏中定义:
- name: Add host to groupname
add_host:
hostname: "{{ newstatic.address }}
groupname: my_instances
dbinstalltype: "CREATE"
customername: "{{ t_customername }}"
seats: "{{ t_seats }}"
with_items: "{{ gce.instance_data }}"
说明:
变量在Ansible中受到惰性求值的影响,所以只有当你使用customername
(update
角色内的某个地方)时,Ansible首次查看其内容,找到一个模板{ {1}}并尝试使用未定义的{{ t_customername }}
变量值来解决它。
在t_customername
任务中定义变量时,评估将在执行add_host
时进行。
关于你的标题“剧本变量/事实以后在剧本中没有提供”:
用add_host
定义的变量是变量,而不是事实(即它们不与任何主机绑定 - 这也是您无法使用vars_prompt
魔术变量访问这些值的原因);
如缩进所示,这些变量仅在定义它们的游戏中可用。