![如何设置一个在运行播放列表后才知道其值的 Ansible 变量?](https://linux22.com/image/681578/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E4%B8%80%E4%B8%AA%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E5%90%8E%E6%89%8D%E7%9F%A5%E9%81%93%E5%85%B6%E5%80%BC%E7%9A%84%20Ansible%20%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我正在编写一个 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}}"