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

时间:2018-03-05 01:43:11

标签: ansible

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

现在我想在同一台服务器上托管另一个网站(例如webserver)。使用此新增功能,snakepics.com角色仍需运行一次,但baseletsencrypt角色现在需要运行两次。此时,我有两个变量文件:

webserver

vars/catpics.com

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

vars/snakepics.com

现在我有这两个变量文件,如何同时运行--- domain_name: snakepics.com # and other variables... ... letsencrypt两个角色? (一次使用webserver变量文件,一次使用vars/catpics.com变量文件)

1 个答案:

答案 0 :(得分:1)

您可以使用不同的 Host Groups 来为每种类型投放并实现目标。主机有两种类型的变量。

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

inventory / hosts文件。

[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 variables使用group_vars/*role_name_file*目录中的单独文件自动获取每个主机组的所有变量