Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 游荡角色和模块角色_Python_Django_Vagrant_Ansible_Provisioning - Fatal编程技术网

Python 游荡角色和模块角色

Python 游荡角色和模块角色,python,django,vagrant,ansible,provisioning,Python,Django,Vagrant,Ansible,Provisioning,我正在使用Vagrant创建Ansible原型,并使用“Vagrant provision”来构建我的堆栈。我已经定义了用于构建核心系统、Web服务器、数据库服务器和应用程序服务器的角色。(核心系统将是任何系统类型所需的角色,例如安装系统包和用户) 我希望将Vagrant配置为执行所有角色(在单个vm上安装所有内容),但在生产环境中,我可能只希望在某些机器上安装某些角色。构建我的剧本和清单文件的最佳方式是什么,这样我就可以容纳单服务器Vagrant机器和多服务器生产机器组 这会涉及到创建多个剧本

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

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

这会涉及到创建多个剧本吗?一个给流浪汉,另一个给对方?如果是这样,可能会导致大量代码重复

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

以下是完整的项目:

流浪汉档案

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'], }
这会涉及到创建多个剧本吗?一个给流浪汉,另一个给对方?如果是这样,可能会导致大量代码重复

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

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

另一个想法是简单地拥有条件角色。如果我理解正确,您有nginxServer、djangoServer和postgresServer组,您的测试虚拟机是所有3个组的成员,而您的生产主机仅是一个或两个组的成员。如果这是正确的,您可以简单地向角色添加条件

例如:

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

    - role: nginx
      tags: nginx
      when: "nginxServer" in group_names
但执行时间会更长,因为Ansible仍将处理所有角色。这些条件实际上会传递给角色中的每个任务,因此您将有许多跳过的任务

这会涉及到创建多个剧本吗?一个给流浪汉,另一个给对方?如果是这样,可能会导致大量代码重复

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

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

另一个想法是简单地拥有条件角色。如果我理解正确,您有nginxServer、djangoServer和postgresServer组,您的测试虚拟机是所有3个组的成员,而您的生产主机仅是一个或两个组的成员。如果这是正确的,您可以简单地向角色添加条件

例如:

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

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

但执行时间会更长,因为Ansible仍将处理所有角色。这些条件实际上会传递给角色中的每个任务,因此您将有许多跳过的任务。

当您决定转到多个主机并仅通过清单文件和每个playbook针对的主机将不同的角色拆分到不同的主机时,您已有的playbook格式可以很好地工作

例如,如果您的设置只有一台web服务器、一台应用程序服务器和一台数据库服务器,则您的资源清册如下所示:

[nginxServer]
web.example.org

[djangoServer]
app.example.org

[postgresServer]
database.example.org
或者,如果您只想将数据库从组合的web/应用程序框中分离出来,您可以使用类似于:

[nginxServer]
app.example.org

[djangoServer]
app.example.org

[postgresServer]
database.example.org
它将运行您的nginx,应用程序将在同一主机上运行

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

[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,然后您可以编写更多的剧本,更具体地针对子组来设置两个框之间的复制

如果您希望能够只针对单个主机组(如
nginxServer
s),那么您可以通过使用原始剧本来实现这一点,或者您可以编写更具体的剧本,然后在您需要调配所有内容时,有一个顶级剧本来运行所有其他剧本:

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

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

当您决定转到多个主机并仅通过清单文件和每个playbook针对的主机将不同角色拆分到不同主机时,您已经拥有的playbook格式可以很好地工作

例如,如果您的设置只有一台web服务器、一台应用程序服务器和一台数据库服务器,则您的资源清册如下所示:

[nginxServer]
web.example.org

[djangoServer]
app.example.org

[postgresServer]
database.example.org
或者,如果您只想将数据库从组合的web/应用程序框中分离出来,您可以使用类似于:

[nginxServer]
app.example.org

[djangoServer]
app.example.org

[postgresServer]
database.example.org
它将运行您的nginx,应用程序将在同一主机上运行

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

[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,然后您可以编写更多的剧本,更具体地针对子组来设置两个框之间的复制

如果您希望能够只针对单个主机组(如
nginxServer
s),那么您可以通过与原始剧本一起使用来实现这一点,或者您可以编写更具体的剧本,然后拥有运行所有oth的顶级剧本