将递增的变量分配给具有ansible的主机列表

将递增的变量分配给具有ansible的主机列表,ansible,ansible-playbook,Ansible,Ansible Playbook,我想要的应该非常简单,但我似乎找不到答案。我想用不同的输入运行数学模拟。我可以访问40台服务器的列表(我没有root权限),所以我的想法是同时在它们上测试40组不同的系数。不清楚如何在ansible中使用类似于for loop的语句设置变量,并将它们分配给不同的服务器。理想情况下,我希望变量列表是浮点数,类似于a=numpy.arange(.0,1.,.1)给我的结果。有什么想法吗 服务器组的设置如下所示: [计算群集] cic[1:40] 让我们创建一个包含两个剧本的剧本: --- - ho

我想要的应该非常简单,但我似乎找不到答案。我想用不同的输入运行数学模拟。我可以访问40台服务器的列表(我没有root权限),所以我的想法是同时在它们上测试40组不同的系数。不清楚如何在ansible中使用类似于
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 %}"