Python 游荡角色和模块角色
我正在使用Vagrant创建Ansible原型,并使用“Vagrant provision”来构建我的堆栈。我已经定义了用于构建核心系统、Web服务器、数据库服务器和应用程序服务器的角色。(核心系统将是任何系统类型所需的角色,例如安装系统包和用户) 我希望将Vagrant配置为执行所有角色(在单个vm上安装所有内容),但在生产环境中,我可能只希望在某些机器上安装某些角色。构建我的剧本和清单文件的最佳方式是什么,这样我就可以容纳单服务器Vagrant机器和多服务器生产机器组 这会涉及到创建多个剧本吗?一个给流浪汉,另一个给对方?如果是这样,可能会导致大量代码重复 这是我到目前为止所拥有的,但它不起作用 以下是完整的项目: 流浪汉档案Python 游荡角色和模块角色,python,django,vagrant,ansible,provisioning,Python,Django,Vagrant,Ansible,Provisioning,我正在使用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的顶级剧本