首页 > 解决方案 > 如何在嵌套的 for 循环中使用 ansible-playbook?

问题描述

我正在尝试编写一个脚本,该脚本将自动重新启动我们环境中的服务器。我们使用 ansible-playbook -i rebootlist reboot.yml 一次重启 100 台服务器,因为我们有大约 400 多台服务器,并且需要按顺序重启。所以,我想出了这个:

for j in $(cat rebootlist); do for k in $(cat $j); do ansible-playbook -i $k reboot.yml  >> $output; done; done

这里,

rebootlist 有 4 个 100 台服务器的列表。

$ cat rebootlist
reboot00
reboot02
reboot03
reboot04

我在下面收到此警告

[警告]:没有解析库存,只有隐式本地主机可用

[警告]:提供的主机列表为空,只有 localhost 可用。请注意,隐式本地主机不匹配“全部”

谢谢拉尔克

标签: linuxfor-loopansible

解决方案


让我们稍微简化一下数据。例如,给定文件

shell> cat rebootlist 
reboot00
reboot02

shell> cat reboot00
host000
host099

shell> cat reboot02
host100
host199

在下面的剧本中,在第一个剧本中创建一个动态组并在第二个剧本中使用它,例如

shell> cat reboot.yml
- hosts: localhost
  gather_facts: false
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: "{{ group }}"
      loop: "{{ lookup('file', group).splitlines() }}"

- hosts: "{{ group }}"
  gather_facts: false
  tasks:
    - debug:
        msg: "Reboot {{ inventory_hostname }}"

然后从文件rebootlist .eg中迭代项目

shell> for j in $(cat rebootlist); do ansible-playbook -e group=$j reboot.yml; done

给出(删节)

PLAY [localhost] ***********************

TASK [add_host] ************************
ok: [localhost] => (item=host000)
ok: [localhost] => (item=host099)

PLAY [reboot00] ************************

TASK [debug] ***************************
ok: [host000] => 
  msg: Reboot host000
ok: [host099] => 
  msg: Reboot host099

PLAY RECAP *****************************
host000: ok=1    changed=0    unreachable=0
host099: ok=1    changed=0    unreachable=0
localhost: ok=1    changed=0    unreachable=0


PLAY [localhost] ***********************

TASK [add_host] ************************
ok: [localhost] => (item=host100)
ok: [localhost] => (item=host199)

PLAY [reboot02] ************************

TASK [debug] ***************************
ok: [host100] => 
  msg: Reboot host100
ok: [host199] => 
  msg: Reboot host199

PLAY RECAP *****************************
host100: ok=1    changed=0    unreachable=0
host199: ok=1    changed=0    unreachable=0
localhost: ok=1    changed=0    unreachable=0

推荐阅读