我目前正在部署新产品,遇到一些问题来构造我的Playbook和角色。我有三种不同的解决方案,希望能得到一些输入最好的路径。

该产品是Windows服务器上的webapp。部署(高级)需要执行以下步骤:


安装javajdk
安装tomcat
安装win_service
配置Java regkes
配置tomcat
安装webapp
启动服务

我使用静态清单进行生产和暂存,group_vars和角色(使用ansible-galaxy创建),因此存在某种结构。


解决方案1 ​​
将所有内容都放入一个巨大的剧本中。听起来不太好,但是它的优点是您可以知道以前安装的变量,例如tomcat需要知道JAVA_HOME的位置...在javajdk的安装位置,由于计算机上有多个Java,因此没有全局JAVA_HOME ...解决方案2
/>用小角色全力以赴。听起来不错,但角色应该彼此独立。我没有找到解耦任务的方法。单一角色例如install_tomcatconfig_tomcat并依次设置一个具有上述角色的剧本?

但是一个角色怎么知道的,例如下一个角色所需的路径名。 ->安装设置路径,配置需要知道。.我真的不确定要使角色独立。


解决方案3
解决方案2。有一个主要的剧本仅包含角色,并尽可能地划分为多个角色。在./roles/vars/main.yml中具有独立的变量名

Somehow(?)在所有需要的var定义所在的剧本的变量优先级中找到更高的位置。在内部将变量传递给角色,或者简单地否决角色变量。

例如。产品具有服务,该服务名称通常是tomcat的路径名的一部分。 tomcat的名称不应取决于服务,因此角色中应该有tomcat_install_path,但产品中也应该有service_name。因此,如果将产品的手册称为服务名称应该是名称的一部分,则以完全不同的部署调用tomcat_install时,就不应摆弄服务名称。


我会采用解决方案3,但尚未找到一种方法来进行设置。专家的意见是,解决方案3可行,是另一个更好的解决方案,还是有第四个解决方案?

#1 楼

我建议按照Ansible Best Practices文档中的结构来构建代码:



,并遵循geerlingguy等对ansible星系平台做出主要贡献的结构。

如果一个人将采用一种截然不同的结构,那么将来真的很难重用这个可折叠星系社区中的角色,而一个人必须重新发明轮子。

评论


谢谢。关于我的问题的具体做法:您将如何解耦和重复使用,例如javajdk安装和它在tomcat安装中的重用?当它们比变量解耦时,例如拍拍javaddk将需要“扮演”角色。在tomcat安装中如何在不更改变量的情况下如何处理呢?有使用可变优先级的通用概念吗?是这样的吗?

– Michael Hoeller
17年11月26日在15:40

我将检查ansible星系并安装jdk和tomcat角色。除非角色不可用,否则我不会自己写角色。例如,github.com/silpion/ansible-tomcat和ansiblebit.oracle-java

– 030
18年1月4日在21:46



请注意,我没有测试tomcat角色。您可以在本地测试tomcat角色。如果这样不起作用,则可以使用来自银河系的另一个tomcat角色。

– 030
18年1月4日在21:52



#2 楼

简短的答案:您在这里进行编程。考虑像“按功能打包”之类的编程标准(cleancode)并构建可重复使用的角色并表达角色原因。例如

roles:
  - role: jdk
  - role: tomcat  
      (contains tasks with 'install tomcat', 'configure tomcat' ) 
      (requires jdk)
  - role: the_wepapp 
      (requires tomcat)


Futhermore:潜在角色,例如jdk永远不应该知道tomcat角色等等...