Ansible使用不同的变量文件多次运行相同的角色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible使用不同的变量文件多次运行相同的角色相关的知识,希望对你有一定的参考价值。

我有一个服务器用于服务一个静态网站(例如catpics.com)。使用Ansible,我有一个base角色(用于设置防火墙,时间,用户帐户等),letsencrypt角色(获取网站的TLS证书)和webserver角色(为网站创建Web根目录)。

现在我想在同一台服务器上托管另一个网站(例如snakepics.com)。有了这个新的补充,base角色仍然需要运行一次,但letsencryptwebserver角色现在需要运行两次。此时,我有两个变量文件:

vars/catpics.com

---
domain_name: catpics.com
# and other variables...
...

vars/snakepics.com

---
domain_name: snakepics.com
# and other variables...
...

现在我有这两个变量文件,如何同时运行letsencryptwebserver角色两次? (一旦使用vars/catpics.com变量文件,并且一次使用vars/snakepics.com变量文件)

答案

您可以使用不同的Host Groups使其针对每种类型运行并实现您的目标。主机有两种类型的变量。

  • 主机变量,特定于组内的单个主机
  • 组变量,用于整个主机组

库存/主机文件。

[catpics]
catpics.com http_port=301
morecatpics.com http_port=80

[snakepics]
snakepics.com
moresnakepics.com

请注意,http_port=是一个与主机名声明内联的主机变量,以空格分隔

然后在同一个文件中,使用host:vars命名格式,定义适用于整个组的组变量。因此所有snakepics主机都将拥有这些变量,并且所有catpics主机都将拥有它们,但保留其各自的主机变量即。 http_port=

[snakepics:vars]
FQDN= https://www.snake.com
VAR2= something2

[catpics:vars]
FQDN= https://www.cat.com
VAR2= something2

太棒了,现在我们已经设置了主机,我们可以定义为每个主机运行的角色。将运行相同的角色

- hosts: catpics
  roles:
      - letsencrypt
      - webserver

- hosts: snakepics
  roles:
      - letsencrypt
      - webserver

或者在这种情况下,主机可以简单地看起来像- hosts: all,它将获得与每种类型的主机(蛇和猫)相对应的变量。

在角色中运行任务时,调用变量就像任何其他ansible变量fetch {{ variable_name }}一样:

-name: Show how variables like this work
domain_name: "{{ FQDN }}"
some_other_task_variable: "{{VAR2}}"

供参考:Host and Group variables

现在,这将以最快的方式解决您的问题。当前的best practice for using group and host variablesgroup_vars/*role_name_file*目录中使用一个单独的文件来自动获取每个主机组的所有变量

以上是关于Ansible使用不同的变量文件多次运行相同的角色的主要内容,如果未能解决你的问题,请参考以下文章

将 Ansible 变量从一个角色(在一个主机上运行)传递给在同一剧本中的另一台主机上运行的另一个角色

自动化运维工具ansible 角色Roles介绍

Ansible 剧本与角色

Ansible 变量赋值

ansible角色roles

如何控制Ansible Playbook的执行顺序运行选定的剧本资源