【问题标题】:Vagrant Ansible and module rolesVagrant Ansible 和模块角色
【发布时间】:2016-03-02 03:28:52
【问题描述】:

我正在使用 Vagrant 对 Ansible 进行原型设计,并正在使用“vagrant provision”来构建我的堆栈。我已经定义了构建核心系统、网络服务器、数据库服务器和应用程序服务器的角色。 (核心系统将是任何系统类型所需的角色,例如安装系统包和用户)。

我想将 Vagrant 配置为执行所有角色(将所有内容安装在单个 vm 上),但在生产环境中,我可能只想在某些机器上安装某些角色。构建我的剧本和库存文件以使我可以容纳单服务器 Vagrant 机器和多服务器生产机器组的最佳方法是什么?

这会涉及创建多个剧本吗?一种用于 Vagrant,另一种用于其他配置?如果是这样,那可能会导致大量重复代码。

这是我目前所拥有的,但它不起作用......

这是完整的项目: https://github.com/JoeJasinski/docker-ansible-web

流浪文件

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provision :ansible do |ansible|
    ansible.playbook = "ansible/site.yml"
    ansible.verbose = "vvv"
    ansible.extra_vars = {}
    ansible.inventory_path = "ansible/inventory.ini"
    ansible.sudo = true
    ansible.groups = {
      "nginxServer" => ["nginxServer",],
      "djangoServer" => ["djangoServer",],
      "postgresServer" => ["postgresServer",]
   }
end

inventory.ini

[nginxServer]
127.0.0.1

[djangoServer]
127.0.0.1

[postgresServer]
127.0.0.1

site.yml

---
- name: Base states
  hosts: all
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/base.yml
  roles:
    - role: base
    - { role: users, tags: ['users'] }
    - { role: sites, tags: ['sites'] }

- name: Nginx Host
  hosts: nginxServer
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/base.yml
  roles:
    - { role: supervisor, tags: ['supervisor'] }
    - { role: nginx, tags: ['nginx'] }

- name: Django Host
  hosts: djangoServer
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/base.yml
  roles:
    - { role: supervisor, tags: ['supervisor'] }
    - { role: django, tags: ['django'] }

- name: Postgres Host
  hosts: postgresServer
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/base.yml
  roles:
    - { role: postgres, tags: ['postgres'],}
    - { role: postgis, tags: ['postgis'], }

【问题讨论】:

    标签: python django vagrant ansible provisioning


    【解决方案1】:

    这会涉及创建多个剧本吗?一种用于 Vagrant,另一种用于其他配置?如果是这样,那可能会导致大量的代码重复。

    您不需要为此复制代码。 Playbooks can include other playbooks. 因此,您可以将每种类型的剧本分开,然后对于 vagrant 有一个顶级剧本,其中包含其他剧本,而对于生产服务器,这些剧本是单独执行的。

    - include: webserver.yml
    - include: database.yml
    - include: application.yml
    

    另一个想法是简单地具有条件角色。如果我理解正确,您有组 nginxServerdjangoServerpostgresServer 并且您的测试虚拟机是所有 3 个组的成员,而您的生产主机只是一个或两个组的成员。如果正确,您可以简单地为角色添加条件。

    例如:

      roles:
        - role: supervisor
          tags: supervisor
          when: "nginxServer" in group_names
    
        - role: nginx
          tags: nginx
          when: "nginxServer" in group_names
    

    虽然执行时间会更长,因为 Ansible 仍然会处理所有角色。条件实际上会传递给角色内的每个任务,因此您会有很多跳过的任务。

    【讨论】:

    • 感谢您提供这里的信息。包含语句似乎非常有用,并且能够有条件地添加这样的组。
    【解决方案2】:

    当您决定转到多个主机并仅通过清单文件和每个剧本所针对的主机将不同的角色分配给不同的主机时,您已经拥有的剧本格式可以正常工作。

    例如,如果您的设置包含一个 Web 服务器、一个应用程序服务器和一个数据库服务器,那么您的库存将如下所示:

    [nginxServer]
    web.example.org
    
    [djangoServer]
    app.example.org
    
    [postgresServer]
    database.example.org
    

    或者,如果您只想将数据库从组合的网络/应用程序框中拆分出来,您将拥有类似的内容:

    [nginxServer]
    app.example.org
    
    [djangoServer]
    app.example.org
    
    [postgresServer]
    database.example.org
    

    哪个会运行你的 nginx 并且应用程序会针对同一个 app.example.org 主机运行。

    同样,您也可以轻松地将事物扩展到更大的环境:

    [nginxServer]
    web-1.example.org
    web-2.example.org
    
    [djangoServer]
    app-1.example.org
    app-2.example.org
    app-3.example.org
    app-4.example.org
    
    [postgresServer:children]
    postgresMaster
    postgresSlave
    
    [postgresMaster]
    database-1.example.org
    
    [postgresSlave]
    database-2.example.org
    

    您在上面的示例中唯一的补充是 postgres 服务器已拆分为主从配置。照原样,这将设置你现在在两个盒子上使用的 postgres,然后你可以编写更多的剧本来更具体地针对子组来设置两者之间的复制。

    如果您希望能够仅针对单个主机组(例如 nginxServers),那么您可以简单地将 --limit 与您的原始剧本一起使用,或者您可以编写更具体的剧本 only target that host group for the role 和然后有一个顶级的剧本来运行所有其他剧本,以便在您想要配置所有内容时:

    site.yml

    - include: webserver.yml
    - include: database.yml
    - include: application.yml
    

    webserver.yml

    - name: Nginx Host
      hosts: nginxServer
      vars:
        - update_apt_cache: yes
      vars_files:
        - env_vars/base.yml
      roles:
        - { role: supervisor, tags: ['supervisor'] }
        - { role: nginx, tags: ['nginx'] }
    

    至于基础角色,我倾向于将该角色设置为dependency,因为无论如何调用该角色,您的所有其他服务器都应该始终与基础角色对抗。为此,您可以在 3 个主要角色下分别创建一个 meta 文件夹,并在其中包含一个包含以下内容的 main.yml 文件:

    dependencies:
        -   role: base
        - { role: users, tags: ['users'] }
        - { role: sites, tags: ['sites'] }
    

    【讨论】:

    • 感谢分享。我最终根据您的建议添加了一堆依赖项。我还有更多重构工作要做​​,但这有助于我走上正轨。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多