RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 937143
Accepted
don Rumata
don Rumata
Asked:2020-01-27 05:42:48 +0000 UTC2020-01-27 05:42:48 +0000 UTC 2020-01-27 05:42:48 +0000 UTC

串行模式下并行启动ansible playbook:1

  • 772

给定:

  • 10 个计算机课程,包含 +/- 10 台计算机。
  • 每个类都有一个 100Mbps 的上行链路。在地板上 - 千兆。
  • CloneZilla 格式的 180 GB 图像。
  • 主机名是已知的,在inventory.ini.
    • 每个班级在其自己的组中:[1403]等[1405]。

需要什么:

  • 将图像分散在每台计算机上。
  • 通过 ansible (v2.7.6 + ubuntu 16.04) 管理部署。
  • 每个类不得同时运行多个实时部署。其余机器正在等待确认。

什么不起作用:

  • 提示serial: 1没有帮助。只部署了一台计算机inventory.ini。
  • 提示serial: 10没有帮助。列表中的前 10 辆汽车已部署,就好像它没有按组划分一样。

一本不能按照您想要的方式工作的剧本:

---
  - name: Run CloneZilla
    hosts: all
    strategy: linear
    serial:
      - 1
    vars:
      filename_rx_end: end-of-rx-label
    tasks:

    - name: Run CloneZilla deploy (send "yes" + Enter)
      when: ansible_system == 'Linux'
      block:
        - command: sudo screen -x -X stuff 'y^M'
        - local_action:
            module: uri
            url: 'http://{{ inventory_hostname }}/{{ filename_rx_end }}'
          register: result
          until: result.status == 200
          retries: 10000
          delay: 10

主要问题:

如何确保同时sudo screen -x -X stuff 'y^M'发送只有1403-01,1405-01等?1407-01然后打开1403-02,1405-02等1407-02。

可能的拐杖:

启动一个单独的会话tmux,创建 10 个终端并启动一个带有单独库存的剧本。但我不想。

和以前一样:

一切同时开始,慢慢地拖了好几天。在某些阶段,无法预测特定计算机是否运行良好或是否需要重做。

或者

在第一个版本中丢失一台计算机意味着整个楼层的重新启动。

linux
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Konstantin Suvorov
    2020-01-29T22:56:20Z2020-01-29T22:56:20Z

    这不能通过琐碎的手段来完成。

    如果可以给Ansible打补丁或者不同组的主机数量相同,有解决办法:https ://stackoverflow.com/a/44670007/2795592

    • 2
  2. don Rumata
    2020-02-01T04:49:10Z2020-02-01T04:49:10Z

    一切都归结为形式上的拐杖tmux。原则上,您可以单独观看每个组,而不考虑整个过程。虽然这一切的第一次发射时间有点长。

    • 0
  3. Best Answer
    don Rumata
    2021-01-01T06:57:48Z2021-01-01T06:57:48Z

    我已经克服了这个问题。从技术上讲,它看起来很笨拙,但 2 次大规模部署已经开始工作。当然,这可以更漂亮地表达出来,但现在至少是一个概念证明。所以:

    亮点:我们serial在清单文件中结合了主机的顺序。

    有 1 个清单文件,其中包含计算机列表和 3 个受众:

    [1404]
    1404-01
    # 1404-02
    1404-03
    1404-04
    1404-05
    # 1404-06
    1404-07
    1404-08
    1404-09
    1404-10
    1404-11
    1404-12
    1404-13
    1404-14
    1404-15
    1404-16
    1404-17
    1404-18
    # 1404-19
    [1405]
    1405-01
    1405-02
    1405-03
    1405-04
    1405-05
    1405-06
    1405-07
    1405-08
    1405-09
    1405-10
    [1406]
    1406-01
    1406-02
    1406-03
    1406-04
    1406-05
    1406-06
    1406-07
    1406-08
    1406-09
    1406-10
    1406-11
    1406-12
    1406-13
    

    有一个 bash 脚本可以计算我们有多少第一台计算机,多少第二台计算机,等等。然后 - 它形成一列必须以相同序列写入的数字:

    PATH_TO_SH="/data/sh"
    PATH_TO_INVENTORY=$(echo "$PATH_TO_SH"/ansible/playbooks/inventory/ecc)
    
    MIN_NUMBER_COMPUTERS="1"
    MAX_NUMBER_COMPUTERS="20"
    
    INI_FILE_4_CALC="ecc-clonezilla.ini"
    
    cd "$PATH_TO_INVENTORY"
    
    # https://stackoverflow.com/a/11891206
    # Формируем в цикле номера, которые совпадают (потому что я так задал хостнеймы) с порядковым номером компьютеров в аудиториях. Т.е. "01, 02, 03..20".
    for i in $(seq -w "$MIN_NUMBER_COMPUTERS" "$MAX_NUMBER_COMPUTERS")
        do
        # sort'ируем по 2-рому столбцу (у нас же схема "кабинет-номер компа"), используя разделитель "-" | убираем "grep -v" назависимо от регистра "-i" все строки, которые содержат "#" и "[" | считаем количество строк, и добавляем пробелов и "-", потому что синтаксис yaml и вот это всё.
        sort -t - -k 2 "$INI_FILE_4_CALC" | grep -E -v -i '(#|\[)' | grep "\-$i" | wc -l | sed 's/^/      - /'
    done
    

    结果,我们得到:

      - 3
      - 2
      - 3
      - 3
      - 3
      - 2
      - 3
      - 3
      - 3
      - 3
      - 2
      - 2
      - 2
      - 1
      - 1
      - 1
      - 1
      - 1
      - 0
      - 0
    

    该列表对应:我们有 3 台第一台计算机,2 台第二台计算机(发现损坏/被盗/蒸发的计算机),3 台第三台计算机。我们将排气写在 中serial:,即 手动编辑剧本。

    库存本身(可以放在原始库存旁边)也必须通过sort -t - -k 2 "$INI_FILE_4_CALC" | grep -E -v -i '(#|\[|^$)'.

    在所有这些神奇之后,该电路在 120 多台机器上完美运行了 3 次(我在上面写了 2。第 3 次 - 处理错误)次。

    备注 1.重要的是要了解计算算法代码是钉在主机命名方式上的,并且要预先知道要处理的最大机器数。如果您的方案有所不同,那么愚蠢的示例复制粘贴将不起作用。

    备注 2。

    方案

    serial:
      - "{{ serial_for_run_deploy.stdout_lines }}"
    

    不起作用。Ansible 立即想知道按什么顺序运行多少个。在里面,任务轨道也没有推。

    PS大家都NG!

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5