我使用 Ansible 来管理一些运行多个虚拟主机的网站的 Web 服务器和数据库服务器。对于每个网站,我需要为 dbservers 组分配一个数据库角色,为 webservers 组分配一个网站角色。所以我的剧本看起来是这样的:
- hosts: dbservers
roles:
- { role: database, vhost: 'host1.com', db: 'customdb' }
- { role: database, vhost: 'other.com' }
- hosts: webservers
roles:
- { role: website, vhost: 'host1.com', db: 'customdb' }
- { role: website, vhost: 'other.com' }
这种方法效果不错,但不太美观,因为我必须重复两次。当更改某些参数的默认值时,这种方法尤其容易出错(例如本例中的 vhost host1.com 上的 db)。
有没有办法编写这个,以便我可以拥有一个包含所有必需参数的虚拟主机列表,并自动将不同的角色添加到每个虚拟主机条目的不同主机组?
答案1
最明显的答案 - 使用复杂变量(字典)来保存你的值,然后传递整个变量:
- layouts:
- layout1:
vhost: host1.com
db: customdb
- layout2:
vhost: other.com
然后使用它们来传递给角色:
- hosts: dbservers
roles:
- { role: database, layout: layouts.layout1 }
- { role: database, layout: layouts.layout2 }
- hosts: webservers
roles:
- { role: webserver, layout: layouts.layout1 }
- { role: webserver, layout: layouts.layout2 }
我以前曾成功做到过这一点。要填充布局,您可以使用各种技术:将“group_vars/all”与“vars_files”和“host_vars”结合起来等。
答案2
我所做的是创建角色apache
,安装 apache 并为所有 vhost 进行一些配置,apache-vhost
安装 vhost,host1-com
和other-com
。然后剧本将是这样的:
- hosts: host1-com-servers
roles:
- apache
- host1-com
- hosts: other-com-servers
roles:
- apache
- other-com
现在,host1-com
将有这个:
- meta:
- dependencies:
- role: apache-vhost
server_name: host1.com
server_aliases:
- www.host1.com
extras: |
Alias /static /var/local/myapp/static
<Location /static>
Require all granted
</Location>
# Whatever else you want
whatever_other_variables_apache-vhost_needs: XXX
(这是一个实现细节,但角色apache-vhost
根据传递给它的变量准备一些必要的 vhost 配置,并且extras
在 vhost 配置中添加变量。)
同样对于数据库,您可以拥有一个postgresql
角色、一个postgresql-database
角色等等。
答案3
您可以按角色对主机进行分组,而不是按功能对主机进行分组,并且仅当主机位于该角色的指定组内时,Ansible 才在主机上运行给定角色。
[role_db_customdb]
other.com
[role_db_otherdb]
host1.com
[role_website]
host1.com
other.com
您甚至可以将参数传递给角色,如db
下面的剧本中的参数所示。
---
- hosts: all
roles:
- { role: database, db: 'customdb', when: inventory_hostname in groups.role_db_customdb }
- { role: database, db: 'otherdb', when: inventory_hostname in groups.role_db_otherdb }
- { role: website, when: inventory_hostname in groups.role_webservers }