我正在使用ansible将我的配置部署到不同的服务器。配置由不同的文件和一个密钥库组成,该密钥库保存用于通信的证书。
我希望能够将完全相同的配置部署到不同的服务器,但dev、staging和prod服务器具有不同的证书。
我目前的想法是使用hosts文件来定义服务器类型,类似于以下内容:
all:
hosts:
prod_server_1:
ansible_user: apps
ansible_ssh_host: 192.168.0.1
type: prod
staging_server_1:
ansible_user: apps
ansible_ssh_host: 192.168.0.2
type: staging
然后将所有三个密钥库添加到配置中(prod.ks、staging.ks和dev.ks(,但只复制与我部署的服务器类型匹配的密钥库
- copy:
src: /conf/keystores/{{type}}.ks
dest: /conf/keystore.ks
是否建议了这种解决方案,或者是否有更标准的方法来解决这种情况?
实际回答您的问题
对我来说,这似乎是一种合理的方式来完成这类任务。由于密钥库是二进制文件,您无法在文件本身中做太多操作,因此需要存储3个不同的文件。但是,我建议对库存文件进行一次更改。当您有少量主机时,就像您的示例中一样,很容易为每个主机设置type
变量。现在,假设你有100位主持人。跟踪每个主机并为每个主机设置变量是非常困难的。因此,最好为每种不同类型的主机设置主机组,并为每组分配一个组变量。通过这种方式,您可以在不必跟踪type
变量的情况下从组中添加和删除机器。看看下面的例子,看看这个新库存会是什么样子。
附加信息:如果该文件是一个文本配置文件,每个主机都有特定的配置,您可以在文件中写入一个jinja模板,然后使用ansible的template
模块来评估该模板并将其复制到服务器。这种情况的优点是只有一个任务(如您现在所拥有的(,并且只有一个模板文件来管理更改。而不是为每种不同类型的主机都有一个单独的文件。
示例:
库存文件test-inv.yml
:
---
prod_servers:
hosts:
prod_server_1:
ansible_user: root
ansible_ssh_host: some-prod-host-1
prod_server_2:
ansible_user: root
ansible_ssh_host: some-prod-host-2
vars:
type: prod
staging_servers:
hosts:
stage_server_1:
ansible_user: root
ansible_ssh_host: some-stage-host-3
stage_server_2:
ansible_user: root
ansible_ssh_host: some-stage-host-4
vars:
type: staging
...
然后我写了这个小剧本test.yml
:
---
- name: test variables...
hosts: all
gather_facts: no
tasks:
- debug: msg="type={{type}}"
这就是输出:
$ ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i test-inv.yml test.yml
PLAY [test variables...] *********************************************************************************************************************************************************************
TASK [debug] *********************************************************************************************************************************************************************************
ok: [prod_server_2] =>
msg: type=prod
ok: [prod_server_1] =>
msg: type=prod
ok: [stage_server_1] =>
msg: type=staging
ok: [stage_server_2] =>
msg: type=staging
PLAY RECAP ***********************************************************************************************************************************************************************************
prod_server_1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
prod_server_2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
stage_server_1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
stage_server_2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0