首页 文章

在Ansible中将共享参数与环境特定参数合并

提问于
浏览
2

我在命令行上运行我的playbooks指定目标服务器环境,例如:

ansible-playbook -e env=staging playbook.yml

现在我希望能够提供参数,例如要在服务器上创建的用户字典,以便所有环境都有用户 common ,以及我运行该playbook的 specificthat one 环境的用户 .

目录结构可能如下所示:

├── group_vars
│   ├── all
│   │   ├── users.yml
│   │  
│   ├── development
│   │   ├── users.yml
│   │  
│   ├── production
│   │   ├── users.yml
│   │  
│   └── staging
│       ├── users.yml

我最初认为像这样的设置可以完成这项工作 . 但是,每个环境的 users.yml 字典永远不会与 all/users.yml 合并

ansible-playbook -e env=production playbook.yml 只会从 production/users.yml 读取 .

如何使用 all/users.yml 从特定环境中使用Ansible合并 users.yml - 这样我始终可以创建公共和特定于env的用户?

1 回答

  • 2

    默认情况下,Ansible将通过具有更高优先级的等效项覆盖哈希/字典值 .

    您可以通过更改ansible.cfg中的hash_behaviour选项来覆盖它,如果您真的想要,但我建议在这样的全局级别反对它 .

    相反,您可以像这样定义您的用户:

    users:
      name: dev-foo
      ...
    

    然后还在你的所有group_vars中定义了一个 all_users 变量,如下所示:

    all_users:
      name: common-foo
      ...
    

    然后你可以通过使用set_fact任务创建合并变量来变量combine

    name: combine users
    set_fact:
      combined_users: '{{ users | combine(all_users) }}'
    

    或者您可以将其直接组合到您打算使用它的任务中:

    name: create users
    user:
      name: {{ item.name }}
      ...
    with_items: '{{ users | combine(all_users) }}'
    

    如果您只是尝试组合2个列表,则可以通过简单添加列表来执行此操作:

    name: combine users
    set_fact:
      combined_users: '{{ users + all_users }}'
    

    或直接:

    name: create users
    user:
      name: {{ item.name }}
      ...
    with_items: users + all_users
    

相关问题