当前位置: 首页 > 知识库问答 >
问题:

可操作的剧本变量/事实,稍后在剧本中不可用

归翔
2023-03-14

我有一个Ansible playbook,它首先在google cloud上创建一个实例,然后将新实例加载到一个组中。然后,它继续并尝试为该组运行一个角色,该角色将更新新的实例设置。我从谷歌云上的Ansible文档中获得了大部分代码。

我真正添加的是添加<code>vars_prompt)和一个用于软件座位数的变量。

在我的剧本中,我使用<code>vars_prompt<code>来收集一些用户输入。我在剧本中使用这些变量:

- 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将其添加到一个组中,然后开始一个新的部分,在那里我要调用一个角色,并将变量<code>t_customname

- name: Manage new instances
  hosts: my_instances
  connection: ssh
  sudo: True

  roles:
    - role: update      
  vars:
    dbinstalltype: "CREATE"
    customername: "{{ t_customername }}"
    seats: "{{ t_seats }}"

当我试图访问<code>{{customername}}

我在上面的< code>sudo: True行下尝试做了一个调试行,结果显示< code>t_customername和< code>t_seats也没有定义。我还试着在第一段代码中调用set_fact,看看是否有帮助,但是这些变量在第二段代码中也没有定义。

是因为我组织双名部分的方式吗?如何将我的< code>vars_prompt变量传递给下一节/角色?

这是我的完整档案。

共有1个答案

曹鹏海
2023-03-14

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中会受到惰性求值的影响,因此只有在您使用客户名称更新角色内部的某个地方)时,Ansible才会第一次查看其内容,找到一个模板{{t_customername}},并尝试使用未定义的变量的值t_customername来解析它。

使用< code>add_host任务中定义的变量,在执行< code>add_host时进行评估。

关于你的标题“剧本变量/剧本中稍后不可用的事实”:

> < li>

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

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

 类似资料:
  • 问题内容: 我有以下两项艰巨的任务 用于获取计算机(Linux)中的接口列表并获取每个接口的总线地址。我在同一本剧本中还有另外一项任务,如下 我希望对var2的值进行迭代,然后打印总线号。 var2.results如下 我的目标是获取上述每个项目中stdout的值,例如(“ stdout”:“ 09:00.0”)。我试图给像 但这不能正确提供标准输出中的总线值。当第二个变量是and indexed

  • 我有一个Java Maven项目,使用Serenity BDD (serenity-bdd)结合Selenium来运行自动化测试。pom.xml包含serenity-bdd依赖项 当我导入时,确保类不可用。其他类 sush Actor 可用: 我已经更新了Maven存储库。我也关注了这个文档:https://serenity-bdd.github.io/theserenitybook/latest

  • 我正在写一本Ansible剧本,在远程服务器上安装先决条件(解压、Python、Docker、Terraform)。运行playbook时,它会通过所有阶段,直到获得“安装地形”部分。在这个阶段,我正在运行一个脚本,在服务器上安装Terraform(手动运行时该脚本工作)。然而,剧本仍停留在那个阶段,没有写日志,也没有失败。 名为“Plans.yml”的剧本是: 叫做“config_Terrafo

  • 根据Ansible的文档,一个剧本是: ...一个非常简单的配置管理和多机部署系统的基础,不像任何已经存在的系统,并且非常适合部署复杂的应用程序。 同样,根据这些文档,一个角色是: 如果有人能给我解释这些差异,我对Ansible的理解将会大大提高! 剧本vs角色vs以及中的类似条目 如果剧本是在YAML文件中定义的,那么角色在哪里定义? 除了Ansible服务器上的之外,如何使用可用的剧本/角色添

  • 我肯定这里有人能解决我的问题。我正在我的可移动主机文件中定义的主机上创建用户。但当用户希望登录时,root用户需要定义用户密码。我需要自动创建用户密码。 要使用playbook创建用户密码,我们不能以明文形式指定密码,只能通过提供哈希值来实现: 非常感谢任何帮助!

  • 是否可以定义一个禁用Javascript的浏览器来模拟爬虫如何查看页面?应该有一个选项可以通过。