我看到了这一点,并感到非常兴奋,但似乎不在这个(或任何版本)的Ansible文档中。
我要解决的问题解决的是,我需要在Centos机器上管理1000个用户。
连续运行此任务需要花费一些时间。更令人烦恼的是,所有内容都显示为已更改,因为用户模块上的“ expires”命令始终将其标记为已更改。
这看起来也很有希望,但是在with_items循环中运行每个命令花费的时间相同,并且运行速度没有更快(我从不费心等待足够长的时间才能结束) 。
现在跳过任务很快(比Ansible 2.0快很多),如果我不知道如何并行进行这项工作,我想我会回头看看了解如何跳过毫无意义的任务,如果所有其他任务都失败了,我将编写自己的模块。但是似乎我应该可以在Ansible中更快地完成所有这些操作。
这是我要并行运行的内容,
host_authorizations
是用户名和其他数据的列表。 - name: Create/modify OS user accounts
user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
with_items: "{{ host_authorizations }}"
tags: full_maintenance
#1 楼
正如@webKnja所提到的,使用async
模式是可能的。我最近亲自发现了它,并了解到可以根据需要以3种不同的方式使用它。执行并轮询结果,请注意
poll:5
,这将每5秒钟轮询一次结果。使用这种方法可以节省一些时间。忘记并忘记
poll: 0
,这是非常快速的选择,因为Ansible只是在执行这些任务。不利的一面是,我们不知道任务的结果是什么,即changed: True/False
。如果您关心反馈,那当然是不利的一环。)。示例2,它将需要其他任务async_status
。这是我的最爱,因为它相对较快(比正常循环或async_status
更快),尽管您需要为execute and poll
处理新的register
,但仍可以捕获反馈。async_task
-尝试了几次在失败之前。retries: 20
-两次轮询之间要等待多少秒。- name: My long runing task
some_module_name:
ip: "{{item.fabric}}"
username: "{{user}}"
password: "{{password}}"
secret: "{{secret}}"
loop: "{{zoning_list}}"
register: _alias_vc_0
async: 60
poll: 5
警告,具体取决于该任务可能无法使用
delay: 2
选项。我有一些示例,其中我与无法处理同一资源的多个请求的系统进行交互。如果必须在多个主机上执行同一任务,我发现async
选项最有效。那是我能够“节省”最多时间的地方。由于您发布了Ansible文档的链接,所以我不想这样做。
评论
@小鸡,您可能想在示例3中将轮询值更改为0。这是一个了不起的解释!谢谢
– Debanjan Basu
19年5月3日,18:43
@DebanjanBasu任何人都可以进行建议的编辑。我可能是在审核队列中批准它的人,但是您应该为编辑本身而功劳。
–小鸡
19年5月3日,19:37
遗憾地不允许编辑一个字符! :(
– Debanjan Basu
19年5月8日在10:32
选项3效果很好,谢谢!但有一条评论:从Ansible 2.8起,async_status要求使用jid而不是id。
–EdwardTeach
19年5月31日在16:24
#2 楼
要回答您的问题:不,到目前为止,Ansible无法并行运行循环。我改用
newusers
,它是为批量用户创建而设计的。创建一个包含所有用户的文件,将其复制到主机,然后在newusers /path/to/user/list
任务中运行command
。#3 楼
使用async
模式可以实现此目的。请在下面找到有关如何执行此操作的参考。参考文献:
http://toroid.org/ansible-parallel-dispatch
https://blog.crisp.se/2018/01/27/maxwenzin/how-to-run-ansible-tasks-in-parallel
---
- name: Run tasks in parallel
hosts: localhost
connection: local
gather_facts: no
tasks:
- name: Pretend to create instances
command: "sleep {{ item }}" # Instead of calling a long running operation at a cloud provider, we just sleep.
with_items:
- 6
- 8
- 7
register: _create_instances
async: 600 # Maximum runtime in seconds. Adjust as needed.
poll: 0 # Fire and continue (never poll)
- name: Wait for creation to finish
async_status:
jid: "{{ item.ansible_job_id }}"
register: _jobs
until: _jobs.finished
delay: 5 # Check every 5 seconds. Adjust as you like.
retries: 10 # Retry up to 10 times. Adjust as needed.
with_items: "{{ _create_instances.results }}"
评论
尽管这些链接可能会中断,但如果您将来的读者没有任何余地,请尝试用自己的文字/示例来展示这将如何帮助解决问题,并仅保留链接以获取更详细的信息。
–滕西拜
18-09-17在7:46
是的,我不能将其标记为答案,直到A.)我对其进行测试并B.)相关代码放在此处。但是,仍然感谢您将我指向这个方向。
– Peter Turner
18/09/17在13:31
抱歉,我很着急:)
– webKnjaZ
18/09/19在11:40
评论
请提供代码段。否则很难提供帮助。@ 030有一个摘要,我想它对上下文有帮助。从概念上讲,我更感兴趣的是是否真的有一种方法可以在同一主机上并行运行任务(循环)。我知道我可以用async来做很多单独的事情,但是用with_items不能做很多。
因此,基本上,如果必须创建1000个用户,则完成它的速度应与仅创建一个用户一样快。有趣的是,为什么不使用LDAP之类的东西呢?
认真地说,您正在走上一条痛苦的道路,我认为没有人会使用本地帐户来处理十几个帐户,而随着用户数量的增长,我认为每个人通常都转向集中式会计系统一些ldap后端(可能是活动目录),然后将到期时间和公钥设置为该中央基础的属性,然后使用sss_ssh_authorizedkeys之类的东西让ssh服务器从该中央基础获取授权密钥。
我不同意这是ansible的用途(提示它并不执行批量用户创建/管理)。我的观点是,不应大量管理本地帐户(事实上,它们不是人工帐户,无论如何都与问题无关)