在嵌套的playbooks之间传递变量

时间:2015-07-29 18:48:22

标签: ansible ansible-playbook

我有一个剧本,我用ec2模块在​​aws中旋转一个实例。为了更灵活,我通过提示输入主机名。我在ec2示例中找到了代码片段,它允许您使用新的spun up实例运行第二个playbook以进行进一步配置。

现在我想通过模块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 }}"
  

致命:[已启动] =>一个或多个未定义的变量:'var_hostname'未定义

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

我找到了DDP,但遗憾的是它没有我可以使用的解决方案。

2 个答案:

答案 0 :(得分:6)

您可以一起使用set_fact和hostvars来实现您的目标。

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

  

{{HOSTVARS ['本地主机'] [" new_fact"]}}

答案 1 :(得分:3)

您可以使用本地文件。

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文件查找也是一个选项。