ansible - Ansible:如何编写以服务为中心的清单?
问题描述
Ansible 通常以主机为中心工作:如果您的主机在清单中的多个组中具有一些主机变量,则该主机的所有变量将被合并,并且具有相同名称的变量将相互覆盖。例子:
# 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
# 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 }}
结果:
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)生成的清单中:
# 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
# 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 }}
...
问题:如何正确/可重复使用/优雅?
解决方案
ansible_host
一个更改最少的解决方案是通过设置并为库存本身引入一个假名称来扩展您的库存,例如
# 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
推荐阅读
- embedded - HTPA32x32d 设备连接错误(预期值不等于接收值)
- xamarin - 升级到 Xamarin.Forms 5.0.0.2012 后无法解决“Xamarin.Forms.Platform.iOS.WebViewRenderer”
- python - 无法编码 Unicode Beautiful Soup Python
- java - 为什么 Mockito 会抛出 NullPointException?
- c++ - 在 C++ 中调用了两次析构函数
- java - 无法检索在另一个记录器对象内的一个记录器中设置的 InheritableThreadLocal 中设置的值
- api - 如何在 v1.1 Twitter API 中获取评论
- flutter - 使用 dart 将 16 位寄存器转换为浮点数
- javascript - 301 重定向到 Azure 存储 Blob 无意中传递了应用凭据
- python - 我在“?”附近收到:尝试执行 Python3 Sqlite3 语句时出现语法错误