在嵌套的playbooks之间传递变量

Byt*_*ger 4 ansible ansible-playbook

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

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

这是我的剧本的样子:

---
- 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 }}"
Run Code Online (Sandbox Code Playgroud)

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

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

我找到了Ansible最佳做法,将vars传递给嵌套的剧本?但不幸的是,它没有我可以使用的解决方案.

van*_*gap 6

您可以将set_fact和hostvars一起使用以实现您想要的效果.

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

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

  • 这有效,答案中的完整剧本示例将是最有用的。 (3认同)

Kai*_*Kai 5

您可以使用本地文件。

1)写

- name: write public ip
  local_action:
    template:
      dest: /tmp/ansible_master_public_ip.txt
      src: templates/public_ip.j2
Run Code Online (Sandbox Code Playgroud)

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

hostname: "{{ lookup('file', '/tmp/ansible_master_public_ip.txt') | trim }}"
Run Code Online (Sandbox Code Playgroud)

附言。如果您需要多个变量,则 Ini 文件查找也是一个选项。