问题标签 [ansible-role]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
21003 浏览

ansible - 使用依赖角色配置 Ansible 角色

最好用一个例子来描述这个问题:

有两个角色:

  • mailserver: 一个基本的邮件服务器配置
  • mailinglist: 邮寄名单申请

邮件列表软件需要邮件服务器将收到的邮件传输到邮件列表软件的“虚拟收件箱”。这需要对邮件服务器进行一些配置。但是邮件服务器不知道邮件列表角色,也不知道其他具有类似配置要求的角色。

我想做的是:

  • mailinglist(和其他类似角色)将传输配置存储在变量transport_config中。这可能是一个“传输图”,例如 $email => $spool。
  • mailinglist取决于mailserver角色。
  • mailserver使用变量配置它的“传输” transport_config

有没有办法在 Ansible 中做这样的事情?或者这个问题的另一种解决方案?不能使用角色变量,如,因为根据邮件服务器的{role: mailserver, transport_config: ...}不同,可能有多个角色。

我能想到的是一种解决方法:邮件服务器读取/解析定义传输映射的配置目录。mailinglist和其他角色将文件添加到此目录。这里的问题是,这通常需要一个“配置构建器”来读取这些配置目录并生成主配置文件。

0 投票
1 回答
1338 浏览

ansible - 从属角色未运行

背景

我正在尝试使用 Ansible (1.9.4) 角色,并试图掌握角色依赖关系。

我创建了以下角色:

  1. 安装 Oracle JDK (ansible-java8) 的角色
  2. 一个安装Tomcat的角色(ansible-tomcat7)

第二个角色将第一个角色定义为/ansible-tomcat7/meta/main.yml

我还包含了一个 requirements.yml 文件,其中包含以下内容:

我已将以下配置添加到我的配置中,/etc/ansible/ansible.cfg以将我的角色路径配置到我的主目录中的某个位置:

然后我使用以下命令安装了ansible-java8角色:java8

运行命令后,我可以在 ~/ansible/roles 目录中看到 java8 角色。

但是,当我运行一个调用 tomcat7 角色的剧本时,只会执行该角色。java8 角色不会在 tomcat7 角色之前执行。

问题

  1. 这是定义依赖角色的正确方法还是我完全错过了什么?
  2. 我是否认为因为我将 tomcat7 角色标记为依赖于 java8,所以我认为 java8 角色应该从角色路径中找到并首先运行?
  3. 我犯了什么错误导致 java8 角色无法在 tomcat7 角色之前运行?
0 投票
1 回答
1094 浏览

ansible - 始终在其他角色之前运行 ansible 角色

我正试图找到摆脱依赖丛林的方法。我正在使用 Ansible 1.9.2。

在单个剧本中,我希望能够安装 Galaxy 角色(如果是 Datadog.datadog 角色)并对其进行配置。但是 Ansible 总是吐槽;由于 Datadog.datadog 角色在我编写的另一个角色安装 Galaxy 角色之前不存在,因此它不会执行。这就是我真正想要的样子,去掉我的剧本使用的其他角色:

我已经尝试了以下所有方法,但它们都不适用于首先安装 Ansible Galaxy Datadog.datadog 角色:

  • 在运行我的 install_datadog 角色的同一剧本中有一个较早的块。
  • 在包含 install_datadog 角色的 main.yml 的剧本中使用前面的“包含”语句。
  • 在上面的剧本中创建一个 pre_task 语句。

定义角色依赖没有意义,因为 Datadog.datadog 还不存在,所以我无法在其中定义任何依赖。总是有类似这样的错误:

我唯一能做的就是在之前的运行中执行 install_datadog 角色。这不是一个很好的解决方案,因为以前有许多执行块和角色调用的剧本配置了我们的整个环境;这将需要以特定顺序执行两个剧本,这是非常不优雅的。

因此,在一次运行中,我如何解决一个 Galaxy 角色,该角色在之前的角色运行安装它之前不存在?

0 投票
1 回答
268 浏览

ansible - Ansible:角色的任务结构

我有4本剧本。其中 2 个正在我的目标计算机上部署服务,其中 2 个正在再次删除它们。现在我想把它们放在角色中。但我不确定最佳实践是什么。
2 个部署剧本只是使用不同的变量和模板做完全相同的事情。同样适用于删除剧本。

Atm 我的结构如下所示:

这是他们打算由用户完成的方式吗?
我特别想知道我的任务做完全相同的事情,但可以在不同的角色中找到。如果我应该将我的任务包含在 main.yml 任务文件中。

0 投票
1 回答
1317 浏览

ansible - 角色或剧本的 Ansible 退出代码,而不是每个单独的任务

是否可以为 Ansible 角色或剧本(不是每个单独的任务)捕获退出代码并根据退出代码进行分支?

我们有一个应用程序需要为每个 Ansible ROLE(而不是任务)创建一个特定的标志(成功/失败)。每个角色一个退出代码。

0 投票
1 回答
627 浏览

db2 - 以 root 身份连接时,如何以 Ansible 角色的非特权用户身份执行特定任务

我尝试使用 Ansible 的升级功能以非特权用户的身份在角色中运行特定任务,但该任务仍由我执行调用该角色的剧本的 root 用户执行。我的问题与在使用相同角色的 root 用户安装和配置 DB2 产品之后在 DB2 for LUW 上创建新数据库有关。我有一个创建新数据库的 shell 脚本,但应该作为 db2inst1(不是 root)运行。我尝试按照官方 Ansible 文档和 stackoverflow 上的一些线程中的建议使用 become、become_user 和 become_method。

这是我的 Ansible 角色的摘录:

或者:

我还将这一行添加到我的ansible.cfg

我还将 Ansible 包从 2.0.1 升级到 2.1;但这没有效果,任务仍以 root 身份运行。

我按如下方式运行我的剧本:

我不知道我错过了什么;请帮助我。

提前致谢!

0 投票
1 回答
1459 浏览

ansible - 在 Ansible 剧本中,如何以更高的并行性应用基于组的角色?

我正在使用 Ansible 2.1。假设我的主机已经分组在库存中。然后我运行这样的剧本:

Ansible 似乎一个一个地应用角色,不管我设置了多少个分叉。有没有更好的方法来构建我的剧本以获得更多的执行并行性,而不会用无用的任务跳过消息向控制台发送垃圾邮件?

换句话说,所以角色bar适用于所有主机,foo同时eek适用于所有baz主机。如果我以组成员身份为条件应用角色,这似乎是一种工作,但是所有的跳过都会使输出变得非常难以阅读。

0 投票
1 回答
12552 浏览

ansible - 如何编写仅在任务文件中的任何先前其他任务已更改时才运行的 Ansible 角色任务?

我正在从事一个角色,当且仅当该任务文件中的任何先前任务已更改时,我希望在任务文件的末尾运行一个任务。

例如,我有:

...并且我只想在已安装更新或更改任何配置文件时重新启动服务。

我怎样才能做到这一点?

0 投票
8 回答
115180 浏览

ansible - Ansible:我可以从命令行执行角色吗?

假设我有一个名为“apache”的角色

现在我想从 Ansible 主机的命令行在主机 192.168.0.10 上执行该角色

有没有办法做到这一点?

0 投票
1 回答
16469 浏览

ansible - 在条件下忽略 Ansible 中的大小写敏感性?

我正在尝试创建一个依赖于其他角色的 ansible 角色,前提是它正在运行的机器的主机名包含某个字符串。例如:

实际上,当机器的主机名包含短语“主机名”时,该角色将运行。但是,我们大楼中的许多机器的主机名都是大写的,例如,它可能包含“HOSTNAME”。在这种情况下,上述语句将不起作用。我怎样才能使这项工作(除了复制行并将“主机名”全部大写)以忽略字母大小写?