Ansible 重复角色

Ansible 重复角色

我使用 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-comother-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 }

相关内容