我是 Ansible 的新手,但我是一个很长时间的程序员,也接触过 puppet。
这是这种情况,我需要初始化一些网络设备,它们不使用 bash,所以我使用的是原始模块,到目前为止一切都很好。但是我在让不同的命令在不同的主机上运行时遇到了问题。我可能有可变数量的主机来设置主机名,从 1 - N,其中 N 小于 10。主机名前缀总是与prefix_ 一样。我想从列表中添加一个后缀:
ctr_suffixes: "[ 'A', 'B', 'C', 'D', 'E']
Run Code Online (Sandbox Code Playgroud)
suffix_list 应该总是有足够的元素来提供唯一的后缀(即 10 级的列表将为指定的 1 - 10 个主机提供后缀,但如果只指定了 3 个,则将使用 A、B、C,但不会更多。)
因此,如果我的库存中有 3 个主机,我想创建一个将产生以下主机名的剧本
prefix_A
prefix_B
prefix_C
Run Code Online (Sandbox Code Playgroud)
需要在每个主机上运行的命令是
set hostname prefix_{{item}}
Run Code Online (Sandbox Code Playgroud)
其中 {{item}} 应填写 A 表示第一台主机,B 表示第二台主机,依此类推。
不幸的是,我尝试过的所有内容都将在清单中的每个主机上应用 set hostname 命令,最后所有主机都命名为 prefix_C
这是我到目前为止无法正常工作的内容:
---
- hosts: controllers_test
gather_facts: no
remote_user: admin
vars:
# ctr_suffixes: [ 'A', 'B', 'C', 'D', 'E' ]
ctr_suffixes: [ 'A', 'B']
tasks:
- name: Assign names to the Controllers
raw: "set hostname ctr-TEST-{{item|quote}}"
with_items: ctr_suffixes
Run Code Online (Sandbox Code Playgroud)
我的ansible_hosts文件有:
[controllers_test]
10.144.38.137
10.144.38.139
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
TASK: [Assign names to the Controllers]
*************************************** ok: [10.144.38.139] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.139] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""}
PLAY RECAP
********************************************************************
10.144.38.137 : ok=2 changed=0 unreachable=0 failed=0
10.144.38.139 : ok=2 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过 with_together 和其他一些东西,但他们似乎都想将整个前缀列表应用于每个主机。如果这使代码更容易,我会满足于保持与主机数量相同数量的列表。
我怀疑我需要使用某种模板。
小智 9
您可以使用主机变量来完成此操作,以便您的ansible_hosts文件具有:
[controllers_test]
10.144.38.137 hostname_suffix=A
10.144.38.139 hostname_suffix=B
Run Code Online (Sandbox Code Playgroud)
然后你的剧本变成:
---
- hosts: controllers_test
gather_facts: no
remote_user: admin
tasks:
- name: Assign names to the Controllers
raw: "set hostname ctr-TEST-{{hostname_suffix|quote}}"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11911 次 |
最近记录: |