Linux—— ansible循环

1.如果有大量的变量要定义,如果多个变量本身类型相同或类似

再比如,同一个剧本,给主机同时安装多个软件包

按照已有的用法,每个软件包都对应不同变量,还会涉及到改剧本

2.现在可以用清单,以及playbook里的hosts指定主机、主机组

但是,能不能再细分?以及进一步的判断?

解决方法

1.循环

比如上面,要同时指定多个service的name

让name调用一个特别的“变量”,叫做item

这个item,指向,同一个task内,和service同级别的loop

在loop里,写具体的成员

进一步简化,loop里的成员,也可以是其他变量

比如在额外的变量文件里写

在loop里调用mail_services

于是,剧本,依旧变成一个通用的东西,不必指定更详细的值

在不同环境和不同项目下,只需要对应编辑、使用不同的变量文件

上面,是管理员,自己定义的变量、各种数据,放到loop里用

根据之前的学习,客户机本身已有的信息(facts)

                以及剧本执行的返回信息

                都可以收集起来,重新放进变量,二次使用

那这些信息,能不能放loop里使用?

大的步骤

1.把信息拿到

  debug

2.把拿到的信息,变成变量

  register

比如上面

写了一个任务(task)

在这个任务里,用了一个item,里面的循环由紧跟着的loop定义

这个任务的输出内容,被接下来的register拿到

注册成一个物件(变量),起一个名字叫echo_results

接下来,第二个任务里

用debug把刚才echo_results变量里的内容,输出到屏幕

限制条件

脚本里可以写匹配、限制条件,SQL语句也可以写条件

ansible剧本也可以写条件

解决最上面说的,第二个问题……

问题的来源

每个task,可以指定主机或主机组

如果task不指定,按照剧本整体的主机、主机组

如果,最终要匹配的主机或主机组,在运行前,并不确定?

剧本本身,并没有再指定其他可用的条件

最后,要让剧本的动作,更明确做在每组、每个不同的主机

于是

在每个task里,单独指定当前任务的限制条件

加一个when模块

判断方式、条件、计算

1.数学符号

==,>=,<=……

2.“类似语句”

比如,变量是否被声明,xxx is defined

3.布尔值

yes/no,0/1……类似这种

4.指定的内容(变量的值)是否包含在条件列表里

比如上面

客户系统的事实里,有一个ansible_distribution值

代表的是系统的族系

管理员自己指定了一个兼容列表,叫supported_distros

指定了,兼容RedHat和Fedora

剧本在执行的时候,查看客户机的系统族系这个属性(在facts里)

如果族系里的值,在兼容列表里,那就符合条件

然后就会执行这个task

于是

脑洞大开,是不是就可以干这么一种事

用系统里不同的段的facts的值,做判断一句……

继续来研究

既然可以搞定,每一个每一种条件

是否有办法,同时匹配多个、多种条件?

也是符合咱基本认知:

  与

  或

再继续

与、或,能不能同时使用/套着使用?

具体,看书的例子……

### 并行发送命令至远程系统的实现方法 为了实现在远程系统上以并行为目标执行命令,可以利用多种技术手段来完成这一需求。以下是几种常见的解决方案及其配置说明: #### 使用 MPI 进行并行通信 消息传递接口 (Message Passing Interface, MPI) 是一种广泛使用的标准库集合,用于支持分布式内存环境中的高性能计算应用开发。通过 MPI 的 `mpiexec` 或者类似的工具能够启动多个进程,并且这些进程可以在不同的节点上运行。 当需要向一组远程主机发送相同的命令时,可以通过编写简单的脚本配合 MPI 来分发任务给各个节点上的程序实例。例如,在 Linux 环境下可创建如下 Python 脚本来调用外部 shell 命令[^1]: ```python from mpi4py import MPI import os comm = MPI.COMM_WORLD rank = comm.Get_rank() if rank == 0: command_to_run = "echo 'This is node {}'".format(rank) else: command_to_run = f"hostname" os.system(command_to_run) result = comm.gather(None, root=0) if rank == 0: print(result) ``` 上述代码片段展示了如何让每个参与的处理器各自独立地执行特定的操作——这里是以打印当前机器名为例。注意此例子仅作演示用途;实际部署可能还需要考虑安全性等因素[^2]。 #### 配置 SSH 批量操作框架 另一种常见做法是借助安全外壳协议(Secure Shell Protocol,SSH),它允许用户登录到另一台计算机的安全终端会话中去执行指令或者传输数据文件等动作。如果要同时针对多台服务器发起请求,则可以构建批量处理机制比如 Fabric/Paramiko(Python 库)/Ansible Playbook 文件等形式自动化管理流程。 对于 Paramiko 实现来说,基本思路就是建立连接池对象列表,然后循环遍历它们依次提交作业直至全部结束为止: ```python import paramiko def run_remote_command(hostname, username='root', password=None, key_filename=None, port=22, cmd=''): client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: if not password and not key_filename: raise ValueError('Either a password or private key must be provided.') elif password: client.connect(hostname, port=port, username=username, password=password) else: client.connect(hostname, port=port, username=username, key_filename=key_filename) stdin, stdout, stderr = client.exec_command(cmd) output = stdout.read().decode() + stderr.read().decode() return {'status': True, 'output': output} except Exception as e: return {'status': False, 'error_message': str(e)} finally: client.close() hosts_list = ['node1.example.com','node2.example.org'] commands_performed = [] for host in hosts_list: result = run_remote_command(host,username="your_user",password="secret_pwd",cmd="ls /tmp/") commands_performed.append((host,result)) print(commands_performed) ``` 这段示例函数接受参数定义好之后就可以轻松扩展成更大规模的应用场景了[^3]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值