问题标签 [ansible-2.x]

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 投票
2 回答
1116 浏览

ansible - 如何确保我的 ansible 模块仅在 master 上运行?

精简版

我想确保我的模块只在 ansible master 上运行(例如 alocal_action或 with connection: local)。并且,如果可能的话,我希望我的模块知道 ansible 项目根目录的路径,而不强制用户提供它作为参数。

实际用例

我正在编写的 ansible 模块由两个可执行文件组成:

  • python 可执行文件——它使用 AnsibleModule 类来保证 ansible 的稳定接口。
  • ruby 可执行文件——它使用 Hiera API。同样,部分是为了稳定性,部分是因为否则我必须在 python 中从头开始编写 hiera。

唯一的问题是,为了运行 ruby​​ 可执行文件,我不得不假设:

  • 事情正在主人身上运行,并且
  • 运行剧本的用户将 ansible 项目根作为他们的 CWD。

我必须假设这些事情,因为由于 ansible 不知道 ruby​​ 可执行文件,因此该可执行文件仅在主服务器上可用。因此,如果它在从属机器上运行,它几乎肯定会因为找不到 ruby​​ 文件而失败。更糟糕的是,这可能是一个安全问题;如果 ansible 从站上存在文件上传漏洞,恶意用户可以确保路径./library/<my_executable>.rb 确实包含可执行文件(例如,启动反向 shell)。

我希望它带有安全的默认值,但我对 ansible 在幕后所做的工作还不够熟悉,以确保发生这种情况。

两个可执行文件都已完成(除了这部分,如上所述,它使用了使用硬编码路径并希望它们在主服务器上的肮脏黑客)并且模块工作。它是可读的、可维护的、经过彻底的单元测试和记录的,而且我不会因为有人认为他们已经想到了更好的方法来重新构建它。这并不是说我客观地想到了最好的方法,只是我找不到一个简单地告诉我“在一个可执行文件中做所有事情”有用的答案。因为那是在回答一个我没有兴趣问的问题。

0 投票
7 回答
199071 浏览

ansible - Ansible - 如果未定义变量,则使用默认值

我正在users我的角色中自定义 linux 创建。我需要让我角色的用户自定义home_directory, group_name, name, password.

我想知道是否有更灵活的方法来处理默认值。

我知道下面的代码是可能的:

但正如我提到的,有很多可选变量,这创造了很多可能性。

有类似上面的代码吗?

未定义name="default_name"时应设置代码。my_variable

我可以设置所有变量defaults/main.yml并像这样创建用户:

但是这些变量在一个非常大的散列中,并且该散列中有一些不能作为默认值的散列。

0 投票
3 回答
87781 浏览

ansible - 通过 ansible 运行 Python 脚本

我正在尝试从 ansible 脚本运行 python 脚本。我认为这将是一件容易的事,但我无法弄清楚。我有一个这样的项目结构:

我正在尝试在 main.yml 的任务中运行 mypythonscript.py(这是 release.yml 中使用的角色)。这是任务:

我也试过../files/mypythonscript.py。我认为 ansible 的路径与剧本有关,但我猜不是?

我还尝试调试以找出我在脚本中间的位置,但也没有运气。

那只是打印出“。”。很有帮助...

0 投票
2 回答
528 浏览

ansible - Ansible 2.0.0.2:ansible 不尊重“-u”开关

我正在 Raspberry PI 2 上探索新安装的 Archlinux 安装,如下所示:

ansible -i PI2 arch -m setup -c paramiko -k -u alarm -vvvv

这对我来说是:针对与用户“警报”连接的 IP 触发设置模块,要求输入该特定用户的密码。然而,最终尝试连接的用户是“root”。

这是调试响应:

Loaded callback minimal of type stdout, v2.0 <192.168.1.18> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 192.168.1.18 192.168.1.18 | UNREACHABLE! => { "changed": false, "msg": "ERROR! Authentication failed.", "unreachable": true }

库存如下所示: [arch] 192.168.1.18

以下是一些可能相关或不相关的事情:

  • 不允许通过 root 进行 ssh 登录
  • sudo 未安装
  • 默认用户和通行证是“警报”:“警报”
  • 没有 ssh 密钥被复制到机器,因此 paramiko 连接尝试

未被忽略并导致连接成功的是添加ansible_user=alarm到清单文件中的 IP 行。

编辑 在官方文档中找到了这个有趣的段落:http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable指出:

Another important thing to consider (for all versions) is that connection specific variables override config, command line and play specific options and directives. For example:

ansible_user will override-uand远程用户:`

原来的问题似乎仍然存在。清单中没有提及ansible_user,为什么使用 root 而不是明确提到的用户 via - u

EDIT_END

这是预期的行为吗?

谢谢

0 投票
2 回答
6145 浏览

ansible - 每个主机的“暂停”

在滚动更新之前,我想在我们的监控工具中为每个主机设置停机时间。我为此创建了一个自定义模块。设置停机时间时可能会出现问题,我们无法解决这些问题。在这种情况下,我想让用户选择在不设置停机时间的情况下决定是中止部署还是继续部署。

所以假设我这样称呼我的模块:

所以我忽略了能够继续的错误。否则,设置停机时间失败的主机将不会被进一步处理。

在下一步中,我希望用户手动确认他是否要为每个没有设置停机时间的主机继续。

不幸的是,pause模块(实际上它是一个动作插件)只会在第一个被处理的主机上暂停。因此,如果第一台主机失败,它将暂停,如果第一台主机通过并且所有其他主机都失败,它将简单地继续所有主机。

这似乎是预期的行为。从文档

pause 模块无需任何特殊考虑即可集成到异步/并行化剧本中(另请参阅:滚动更新)。当使用带有serialplaybook 参数的暂停时(如在滚动更新中),您只会被提示一次当前主机组。

所以无论如何,即使我会使用serial: 1(在这种情况下不可能)暂停也只会为第一个主机停止。

现在我只是在没有条件的情况下暂停,让用户决定是否要继续,无论停机任务是否失败。但由于失败应该非常罕见,这是我想避免的手动步骤。

任何人都可以看到解决方案如何:

  • 为每个主机暂停(失败的)
  • 暂停一次,以防任何主机出现故障
0 投票
2 回答
1787 浏览

ansible - 无法在ansible的host文件中动态添加host

以下是脚本(Ansible 版本为 2.1.0):

上面的脚本正在查找 vm 的 ip 地址并尝试使用 ip-address(直接而不是通过 vCenter 服务器)而不是使用 vsphere_guest 模块连接到该 vm。我使用 add_host 模块在库存文件中动态添加主机。但是我在 add_host 模块之后(不是在 add_host 任务中,而是在它之后)在执行它时收到以下错误:

意外异常:预期的字符串或缓冲区

使用 -vvvv 的完整回溯是:

0 投票
1 回答
210 浏览

amazon-web-services - 如何使用 Ansible 在 AWS 的不同区域启动可变数量的实例

我们使用 Ansible 和 AWS 来自动配置服务器。我对如何使用ec2模块启动服务器有相当清楚的了解,但仍有一些地方不清楚。

我的问题有以下两个方面:

1) 我如何使用 ec2 来启动区域 1 中的 3 台服务器和区域 2 中的 5 台服务器等。?我是否使用 2 个单独的剧本,循环执行 ec2 任务等?基本上,如果我想在多个地区建立具有不同数量的服务器。

2)一旦我完成了上面的步骤 1 并在不同区域创建了不同数量的服务器,并使用 add_host 模块保存它们的 ips,我如何将这些 ips 传递到 playbook 中的下一步,这将是定义的多个角色单独的文件?

0 投票
1 回答
9478 浏览

ansible - 通过 ansible 运行带参数的脚本

[Ansible 版本 == 2.1.0]

为了运行目标服务器本地的脚本,我们可以使用 Ansible 的“命令”模块。以下可以轻松完成:

我有我的脚本名称和存储在 ansible 变量中的参数。例如,以下变量包含所有脚本名称和要传递给这些脚本的参数:

我希望目标服务器上已经存在的所有这些文件都使用 with_items 执行。试图实现以下目标:

我正在尝试传递脚本名称,后跟包含要传递到脚本中的所有参数的字符串。但它正在将那一串参数视为一个参数。

0 投票
1 回答
2563 浏览

ansible - Ansible 上没有与“mesos”匹配的包

我正在配置一个 mesos-marathon 集群。我的下一个角色是安装 java 和 mesos。

我的问题是,当我执行剧本时,它给了我下一个错误:

Ansible 错误

但是,如果我第二次执行 ansible,它会完美运行,您可以看到第二次执行:

Ansible 作品

可能是什么问题呢?

谢谢。

@ydaetskcoR 的解决方案

更改任务“instalar mesos”:

0 投票
1 回答
399 浏览

configuration - RPM 安装后 Ansible 修改文件

作为我的 Ansible 剧本的一部分,我从内部存储库下载并安装了一个 RPM。这个 RPM 附带了一堆配置。对于我的大多数机器,我不需要更改此配置。然而,对于一个由 ansible 组定义的小子集,我需要修改一些配置字段。

我假设我需要这样做:

  1. 等到我的 RPM 安装并“运行”
  2. 停止服务
  3. 以某种方式修改配置文件?使用 when 子句将其限制为我要修改的组。
  4. 重启服务

或者可能有更好的方法来实现这一点。有人可以建议我如何实现我的总体目标吗?