【问题标题】:Ansible: Use variable for defining playbook hostsAnsible:使用变量来定义剧本主机
【发布时间】:2017-04-20 22:16:31
【问题描述】:

我安装了以下版本:ansible 2.3.0 (devel 2131eaba0c)

我想将我的宿主变量指定为外部变量,然后在 playbook 中使用它,类似于:

hosts: "{{integration}}"

在我的 group_vars/all 文件中,我定义了以下变量:

integration: "int60"

主机文件如下所示:

[int60] 
hostA

[int61]
hostB

不幸的是,这不起作用。我还尝试通过以下方式定义 host var

[integration]
127.0.0.1 ansible_host="{{ integration_env }}"

并在我的 group_vars/all 文件中指定 integration_env。在这种情况下,它似乎是在本地而不是在所需的环境中运行任务。

有可能做这样的事情吗?我愿意接受全新的方式来做到这一点。主要目标只是在 var 文件中定义宿主变量。

【问题讨论】:

    标签: ansible ansible-playbook ansible-2.x


    【解决方案1】:

    如果您将 integration 变量作为额外变量传递,这将起作用:

    ansible-playbook -e integration=int60 myplaybook.yml
    

    play“header”中使用的任何变量,都应该在 Ansible 解析 playbook 之前定义。

    在您的示例中,您将 integration 定义为主机事实。事实仅在任务级别上定义,而不是在游戏级别上定义。

    更新:您可以使用其他方式传递变量,而不仅仅是额外的变量。 例如:

    - hosts: "{{ lookup('env','DYN_HOSTS') }}"
    

    也可以。

    【讨论】:

    • 感谢您的快速回答。我见过这样的解决方案,但这对我不起作用,因为我正在通过不允许传递任何额外变量的 jenkins 作业(和 ansible 插件)运行 ansible。另外,我需要在 ansible 任务中更改集成变量,以便下一次运行会选择不同的环境。你知道其他解决方案吗?
    • jenkins ansible 插件确实允许额外的变量。在 Jenkins 中创建 Ansible 步骤时,它隐藏在“高级”选项下。
    • @Steve:是的,你是对的,但我需要通过 ansible 任务更改这个变量,所以这个解决方案对我不起作用。
    • @Konstantin:将变量存储在环境变量中是一种有效的解决方案(例如,将存储的 ansible 变量导出到上一个任务中的环境变量并在之后使用),但直接使用该变量是更好的。所以我的问题是:这可能吗?
    • 不,从以前的任务影响下一场比赛的主持人的唯一方法是动态组。您将静态组名称硬编码到您的游戏中,并在之前的游戏中填充它。见stackoverflow.com/a/38631923/2795592
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2018-09-21
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多