如何设置一个在运行播放列表后才知道其值的 Ansible 变量?

如何设置一个在运行播放列表后才知道其值的 Ansible 变量?

我正在编写一个 Ansible 脚本来设置新的 TeamCity 构建代理,但其中有一部分我不知道如何实现自动化。安装 TeamCity 构建代理后,必须由管理员授权,管理员登录构建服务器并单击构建代理旁边的“授权”按钮。这将创建一个授权令牌,然后将其保存在代理的文件中buildAgent.properties。我想要做的是提取该令牌并将其保存在该构建代理的主机变量中,这样如果我重新运行 Ansible 脚本,正确的授权令牌将被复制过来,代理将不需要重新授权。

我可以轻松地手动完成此操作:在管理员登录并授权代理后,我可以从代理buildAgent.properties文件中复制授权密钥,将其放入host_vars/(agent name)/buildagent.yml,然后完成。但是有没有办法自动完成此操作?任何手动步骤都是必须记录的步骤,并且有人可能会忘记执行 - 这就是我们首先使用 Ansible 的原因。

我发现set_fact模块乍一看很有希望,但它说“这些变量将在 Ansible 运行期间继续存在,但执行后不会保存即使你使用事实缓存。”(重点是我的)。事实缓存和注册变量似乎也不是我想要的。

也许我可以有一个在 Ansible 主机上重写的 Ansible 任务host_vars/(agent name)/buildagent.yml——我想这可以行得通。但这似乎相当笨拙。有没有一种“官方”方法来为未来的剧本运行设置主机变量,我只是还没有找到?或者我只需要在这里接受我的流程中的一个手动步骤?

答案1

你可以从文件中读取授权令牌居住,如果未设置则会失败。

- name: Read authorization token
  command: "grep authorizationToken .../buildAgent.properties | cut -f 2 -d ="
  register: result
  failed_when: result.stdout == ""

- name: Set authorization token fact
  set_fact: authorization_token="{{result.stdout}}"

相关内容