将递增的变量分配给具有ansible的主机列表
我想要的应该非常简单,但我似乎找不到答案。我想用不同的输入运行数学模拟。我可以访问40台服务器的列表(我没有root权限),所以我的想法是同时在它们上测试40组不同的系数。不清楚如何在ansible中使用类似于将递增的变量分配给具有ansible的主机列表,ansible,ansible-playbook,Ansible,Ansible Playbook,我想要的应该非常简单,但我似乎找不到答案。我想用不同的输入运行数学模拟。我可以访问40台服务器的列表(我没有root权限),所以我的想法是同时在它们上测试40组不同的系数。不清楚如何在ansible中使用类似于for loop的语句设置变量,并将它们分配给不同的服务器。理想情况下,我希望变量列表是浮点数,类似于a=numpy.arange(.0,1.,.1)给我的结果。有什么想法吗 服务器组的设置如下所示: [计算群集] cic[1:40] 让我们创建一个包含两个剧本的剧本: --- - ho
for loop
的语句设置变量,并将它们分配给不同的服务器。理想情况下,我希望变量列表是浮点数,类似于a=numpy.arange(.0,1.,.1)
给我的结果。有什么想法吗
服务器组的设置如下所示:
[计算群集]
cic[1:40]
让我们创建一个包含两个剧本的剧本:
---
- hosts: localhost
connection: local
tasks:
- name: Create Variable File for Each host
template: src=my_template.yml.j2 dest=host_vars/{{ item.1 }}
with_indexed_items: "{{ groups['computingCluster'] }}"
- hosts: computingCluster
pre_tasks:
- name: Load Host Specific Generated Variables
include_vars: host_vars/{{ inventory_hostname }}
tasks:
- debug: var=coefficient
- 首先,播放将根据每个主机的模板生成主机变量文件
- 第二个
将在主机上执行实际任务Play
/tmp/ansible
├── [host_vars]
├── inventory
├── my_template.yml.j2
└── playbook.yml
库存文件:
[computingCluster]
cic[1:10]
用于加载主机变量()的模板my_Template.yml.j2
:
包含两个剧本的剧本:
---
- hosts: localhost
connection: local
tasks:
- name: Create Variable File for Each host
template: src=my_template.yml.j2 dest=host_vars/{{ item.1 }}
with_indexed_items: "{{ groups['computingCluster'] }}"
- hosts: computingCluster
pre_tasks:
- name: Load Host Specific Generated Variables
include_vars: host_vars/{{ inventory_hostname }}
tasks:
- debug: var=coefficient
下面是结果ansible playbook-i inventory playbook.yml
:
PLAY [localhost] **************************************************************
TASK: [Create Variable File for Each host] ************************************
ok: [localhost] => (item=(0, 'cic1'))
ok: [localhost] => (item=(1, 'cic2'))
ok: [localhost] => (item=(2, 'cic3'))
ok: [localhost] => (item=(3, 'cic4'))
ok: [localhost] => (item=(4, 'cic5'))
ok: [localhost] => (item=(5, 'cic6'))
ok: [localhost] => (item=(6, 'cic7'))
ok: [localhost] => (item=(7, 'cic8'))
ok: [localhost] => (item=(8, 'cic9'))
ok: [localhost] => (item=(9, 'cic10'))
PLAY [computingCluster] *******************************************************
GATHERING FACTS ***************************************************************
ok: [cic1]
ok: [cic5]
ok: [cic4]
ok: [cic2]
ok: [cic3]
ok: [cic6]
ok: [cic9]
ok: [cic10]
ok: [cic8]
ok: [cic7]
TASK: [debug var=coefficient] *************************************************
ok: [cic1] => {
"var": {
"coefficient": "0"
}
}
ok: [cic2] => {
"var": {
"coefficient": "1"
}
}
ok: [cic3] => {
"var": {
"coefficient": "2"
}
}
ok: [cic4] => {
"var": {
"coefficient": "3"
}
}
ok: [cic6] => {
"var": {
"coefficient": "5"
}
}
ok: [cic5] => {
"var": {
"coefficient": "4"
}
}
ok: [cic7] => {
"var": {
"coefficient": "6"
}
}
ok: [cic8] => {
"var": {
"coefficient": "7"
}
}
ok: [cic9] => {
"var": {
"coefficient": "8"
}
}
ok: [cic10] => {
"var": {
"coefficient": "9"
}
}
PLAY RECAP ********************************************************************
cic1 : ok=2 changed=0 unreachable=0 failed=0
cic10 : ok=2 changed=0 unreachable=0 failed=0
cic2 : ok=2 changed=0 unreachable=0 failed=0
cic3 : ok=2 changed=0 unreachable=0 failed=0
cic4 : ok=2 changed=0 unreachable=0 failed=0
cic5 : ok=2 changed=0 unreachable=0 failed=0
cic6 : ok=2 changed=0 unreachable=0 failed=0
cic7 : ok=2 changed=0 unreachable=0 failed=0
cic8 : ok=2 changed=0 unreachable=0 failed=0
cic9 : ok=2 changed=0 unreachable=0 failed=0
localhost : ok=1 changed=0 unreachable=0 failed=0
您可以使用jinja模板随时使用系数变量
参考资料:
me@pc:~/Ansible/playbooks/test\u迭代$Ansible playbook test0.yml
玩***************************************************************************
任务[设置]*******************************************************************
ok:[srv-db1]
ok:[srv db temp]
任务[调试]*******************************************************************
确定:[srv数据库温度]=>{
“msg”:“101”
}
确定:[srv-db1]=>{
“msg”:“102”
}
重演*********************************************************************
srv db temp:ok=2已更改=0无法访问=0失败=0
srv-db1:确定=2更改=0无法访问=0失败=0
test0.yml:
hosts: srv-dbs
vars:
- priority_start: 100
tasks:
- debug: msg="{% for thishost in play_hosts %}{% if inventory_hostname==thishost %}{{ priority_start + loop.index }}{% endif %}{% endfor %}"
主持人:srv dbs
变量:
-优先启动:100
任务:
-调试:msg=“{%forthishhost in play_hosts%}{%if inventory_hostname==thishhost%}{{priority_start+loop.index}}{%endif%}{%endfor%}”
您能举几个例子说明应该在服务器上运行什么命令吗?所以cic1可能有python-myProgram 0.1
cic1可能有python-myProgram 0.2
等等,就像你说的那样,我也可以用jinja2模板在代码中硬编码参数名,这样它们在被复制时会自动被替换。谢谢你的答案,我想我可以调整你的答案,让它工作,但这不是我想要的。只有当你第二次执行剧本时,你的结果才会显示出来。ansible的工作方式是在开始时加载所有变量文件。由于在第一次运行开始时不存在任何变量文件,ansible没有要加载的主机变量文件。所以你必须把你的两部剧本分成两个剧本,这并不理想。@凌晓霞,我想你在这里弄错了-我在本地测试了这个,它对我非常有效。只需查看输出。这个剧本里面有两次运行-在第一次运行期间,将生成变量文件,在第二次播放期间,将按预期加载文件。如果您愿意,我可以与您共享测试环境。我可能弄错了,但ansible似乎一次(在运行任何游戏之前)在我的机器上为同一剧本中的游戏加载变量。请删除所有变量文件并重试,好吗?我的ansible版本是1.9。3@LingxiaoXia,将playbook更改为从生成的文件显式加载变量。请检查pre\u tasks
部分以及include\u vars
task()
hosts: srv-dbs
vars:
- priority_start: 100
tasks:
- debug: msg="{% for thishost in play_hosts %}{% if inventory_hostname==thishost %}{{ priority_start + loop.index }}{% endif %}{% endfor %}"