【问题标题】:Passing variables between nested playbooks在嵌套的剧本之间传递变量
【发布时间】:2015-07-29 18:48:22
【问题描述】:

我有一本剧本,我正在使用 ec2 模块在 aws 中启动一个实例。为了更灵活,我通过提示输入主机名来询问。我在ec2 示例中找到了代码 sn-p,它允许您使用新启动的实例运行第二个剧本以进行进一步配置。

现在我想通过模块 hostname 设置主机名,但我无法访问第二个剧本中的变量。

这就是我的剧本的样子:

---
- hosts: localhost
  ...

  vars_prompt:
    - name: var_hostname
      prompt: "Please enter the hostname"
      private: no

  tasks:

    - name: Spin up instance
      local_action:
        module: ec2
        ...
      register: ec2

    - name: Add new instance to host group
      add_host: hostname={{ item.public_ip }} groupname=launched
      with_items: ec2.instances

- hosts: launched
  ...

  tasks:

    - name: Set hostname
      hostname: name="{{ var_hostname }}"

fatal: [launched] => 一个或多个未定义变量:'var_hostname' 未定义

有没有办法将变量从一个剧本传递到另一个剧本?

我找到了Ansible best practice for passing vars to nested playbooks?,但不幸的是它没有我可以使用的解决方案。

【问题讨论】:

标签: ansible ansible-playbook


【解决方案1】:

你可以一起使用 set_fact 和 hostvars 来实现你想要的。

在一组主机(即 localhost)上执行 set_fact,并使用 hostvars 在不同的游戏中访问它们

{{hostvars['localhost']["new_fact"]}}

【讨论】:

【解决方案2】:

您可以使用本地文件。

1) 写

- name: write public ip
  local_action:
    template:
      dest: /tmp/ansible_master_public_ip.txt
      src: templates/public_ip.j2

2) 使用http://docs.ansible.com/ansible/playbooks_lookups.html检索

hostname: "{{ lookup('file', '/tmp/ansible_master_public_ip.txt') | trim }}"

PS。如果您需要多个变量,也可以选择 Ini 文件查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多