以后在剧本

时间:2017-10-27 23:25:37

标签: ansible

我有一个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_customnamet_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_customernamet_seats在那里也是未定义的。我也尝试在第一个代码部分调用set_fact来查看是否有帮助,但在第二个代码部分中这些变量也未定义。

是否因为我构建我的两个名字部分的方式?如何将vars_prompt变量传递给下一部分/角色?

这是我的full file

1 个答案:

答案 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中受到惰性求值的影响,所以只有当你使用customernameupdate角色内的某个地方)时,Ansible首次查看其内容,找到一个模板{ {1}}并尝试使用未定义的{{ t_customername }}变量值来解决它。

t_customername任务中定义变量时,评估将在执行add_host时进行。

关于你的标题“剧本变量/事实以后在剧本中没有提供”:

  • add_host定义的变量是变量,而不是事实(即它们不与任何主机绑定 - 这也是您无法使用vars_prompt魔术变量访问这些值的原因);

  • 如缩进所示,这些变量仅在定义它们的游戏中可用。