首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:如何编写以服务为中心的清单?

Ansible:如何编写以服务为中心的清单?
EN

Stack Overflow用户
提问于 2019-05-21 20:04:58
回答 1查看 62关注 0票数 0

Ansible通常以主机为中心工作:如果您的主机在清单中的多个组中有一些主机变量,则该主机的所有变量将被合并,并且具有相同名称的变量将相互覆盖。示例:

代码语言:javascript
复制
# Inventory

[app_stages:children]
stage_development
stage_acceptance

[stage_development]
localhost db_unique_name=scdev oracle_version_db=12.1.0.2 oracle_edition_db=SE2
localhost db_unique_name=ecdev oracle_version_db=12.1.0.2 oracle_edition_db=EE

[stage_acceptance]
localhost db_unique_name=scacp oracle_version_db=18 oracle_edition_db=SE2
localhost db_unique_name=ecacp oracle_version_db=18 oracle_edition_db=EE
代码语言:javascript
复制
# Playbook
- name: test inventory
  hosts: "{{ hostgroup }}"

  tasks:
    - name: show variables
      debug:
        msg: host {{ ansible_hostname }}, db_name = {{ db_unique_name }}, db_version = {{ oracle_version_db }}, db_edition = {{ oracle_edition_db }}

结果:

代码语言:javascript
复制
   ansible-playbook playbook_1.yml -i inventory_1 -e hostgroup=stage_development

   TASK [show variables]  ******************************************************************************************************************
   ok: [localhost] => {
       "msg": "host server_1, db_name = ecacp, db_version = 18, db_edition = EE"
   }

这表明,即使我请求ansible只在stage_development上工作,它也会使用并显示另一个组中设置的变量。

我需要一种不同的方法:首先,我希望使用一些基本参数(例如数据库名称、版本等,见上)来指定服务。是否将它们中的一些或全部部署到同一主机是次要的。这个可以工作,但不是很优雅,因为关于服务的信息在攻略中,而不是在清单中,后者应该在稍后由一些外部工具(CMS)生成:

代码语言:javascript
复制
# Inventory
[app_stages:children]
stage_development
stage_acceptance

[stage_development:children]
srv_scdev
srv_ecdev

[stage_acceptance:children]
srv_scacp
srv_ecacp

[srv_scdev]
localhost

[srv_ecdev]
localhost

[srv_scacp]
localhost

[srv_ecacp]
localhost
代码语言:javascript
复制
# Playbook
---

- name: stage development, setup database scdev
  hosts: srv_scdev
  vars:
    db_unique_name: scdev
    oracle_version_db: 12.1.0.2
    oracle_edition_db: SE2
  tasks:
    - name: show variables
      debug:
        msg: host {{ ansible_hostname }}, db_name = {{ db_unique_name }}, db_version = {{ oracle_version_db }}, db_edition = {{ oracle_edition_db }}

- name: stage development, setup database ecdev
  hosts: srv_ecdev
  vars:
    db_unique_name: ecdev
    oracle_version_db: 12.1.0.2
    oracle_edition_db: EE
  tasks:
    - name: show variables
      debug:
        msg: host {{ ansible_hostname }}, db_name = {{ db_unique_name }}, db_version = {{ oracle_version_db }}, db_edition = {{ oracle_edition_db }}

- name: stage acceptance, setup database scacp
  hosts: srv_scacp
  vars:
    db_unique_name: scacp
    oracle_version_db: 18
    oracle_edition_db: SE2
  tasks:
    - name: show variables
      debug:
        msg: host {{ ansible_hostname }}, db_name = {{ db_unique_name }}, db_version = {{ oracle_version_db }}, db_edition = {{ oracle_edition_db }}

- name: stage acceptance, setup database ecacp
  hosts: srv_ecacp
  vars:
    db_unique_name: ecacp
    oracle_version_db: 18
    oracle_edition_db: EE
  tasks:
    - name: show variables
      debug:
        msg: host {{ ansible_hostname }}, db_name = {{ db_unique_name }}, db_version = {{ oracle_version_db }}, db_edition = {{ oracle_edition_db }}

...

问:如何做对/可重用/优雅?

EN

回答 1

Stack Overflow用户

发布于 2019-05-21 20:58:29

更改最少的解决方案是通过设置ansible_host并为清单本身引入一个假名称来扩展清单,如下所示

代码语言:javascript
复制
# Inventory

[app_stages:children]
stage_development
stage_acceptance

[stage_development]
dev1 ansible_host=localhost db_unique_name=scdev oracle_version_db=12.1.0.2 oracle_edition_db=SE2
dev2 ansible_host=localhost db_unique_name=ecdev oracle_version_db=12.1.0.2 oracle_edition_db=EE

[stage_acceptance]
stage1 ansible_host=localhost db_unique_name=scacp oracle_version_db=18 oracle_edition_db=SE2
stage2 ansible_host=localhost db_unique_name=ecacp oracle_version_db=18 oracle_edition_db=EE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56237922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档