Ansible:设置主机名称在库存

我是Ansible的新手,但是很长一段时间的程序员,也和puppet一起工作了一下。

这是情况,我需要初始化一些networking设备,他们不会说bash,所以我使用的是原始模块,到目前为止,在这方面一切都很好。 但是我有问题获得不同的命令在不同的主机上运行。 我可能有一个可变数量的主机来设置主机名,从1到N,其中N在10以下。主机名前缀总是像prefix_一样 。 我想从列表中添加一个后缀:

ctr_suffixes: "[ 'A', 'B', 'C', 'D', 'E'] 

suffix_list应该总是有足够的元素来提供一个唯一的后缀(例如,一个大小为10的列表将提供从1到10个指定主机的后缀,但是如果只指定了3个,那么A,B,C将被使用,但不会被使用。

所以,如果我的库存中有3台主机,我想创build一个可以产生以下主机名的操作手册

 prefix_A prefix_B prefix_C 

需要在每个主机上运行的命令是

 set hostname prefix_{{item}} 

其中{{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 

我的ansible_hosts文件有:

 [controllers_test] 10.144.38.137 10.144.38.139 

我得到的结果是:

 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 

我已经尝试with_together和其他一些东西,但他们似乎都想要将整个前缀列表应用到每个主机。 如果这使得代码更容易,我会保留与主机数量相同的列表。

我怀疑我需要使用某种模板。

你可以用hostvariables来完成这个工作,这样你的ansible_hosts文件就有了:

 [controllers_test] 10.144.38.137 hostname_suffix=A 10.144.38.139 hostname_suffix=B 

然后你的剧本变成:

 --- - hosts: controllers_test gather_facts: no remote_user: admin tasks: - name: Assign names to the Controllers raw: "set hostname ctr-TEST-{{hostname_suffix|quote}}"