0
点赞
收藏
分享

微信扫一扫

Ansible(二)如何在多台主机上批量执行任务

拾光的Shelly 2022-03-17 阅读 57

Ansible批量执行任务有两种方式​​adhoc​​​和​​playbook​​​,当执行简单的命令时,可以使用​​adhoc​​​,当执行复杂的命令,涉及多个模块/条件等时,建议使用​​playbook​

module 模块

​ansible​​的底层是​​python​​,但是我们在使用​​ansible​​的时候不需要写​​python​​脚本,而是直接调用模块即可。

模块是由红帽官方或者其他合作伙伴或开发爱好者开发好的脚本,我们可以通过调用模块,来执行对应的命令。

查看所有ansible模块

​ansible-doc -l​

查看指定模块的使用帮助

​ansible-doc ping​

常用模块

文件相关模块

  • copy 复制本地文件到被管理主机
  • file 设置文件的权限和属性
  • lineinfile 设置文件内容
  • synchronize 使用rsync同步内容

软件包管理相关模块

  • package 根据被管理主机操作系统自动选择工具管理软件包
  • yum 使用yum包管理工具管理软件包
  • apt 使用APT包管理工具管理软件包
  • dnf 使用DNF包管理工具管理软件包
  • gem 管理Ruby gems
  • pip 通过PyPI管理Python软件包

系统相关模块

  • firewalld 使用firewalld管理防火墙
  • reboot 重启机器
  • servcie 管理服务
  • user 管理用户

adhoc

格式

​ansible" host-pattern" -m "module" -a"module argument" -i "inventroy-path"​

参数

  • ​-m​​ 模块
    如果不指定​​-m​​,默认使用​​command​​模块,​​command​​模块可以直接在被管理主机上执行​​Linux​​命令
  • ​-a​​ 模块参数
  • ​-u​​ remote_user
  • ​-i​​ inventory路径

示例

[root@localhost ~]# ansible all -m ping
servera.lab.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}

playbook

​playbook​​​是一个​​yaml​​​格式的文件,后缀名为​​.yml​​​或者​​.yaml​

playbook文件内容

在一个​​playbook​​文件中,可以包含多个​​play​

一个​​play​​就是要在指定主机中执行的一系列操作,在一个​​play​​中可以指定​​hosts​​(在哪些主机上执行)和​​tasks​​(执行哪些命令)

​tasks​​中可以包含多个​​task​​,每个​​task​​就是对一个模块的调用

playbook文件示例

# YAML文件以---开头
---
# - 表示列表
# 第一个play 名称是Configure web server
- name: Configure web server
# hosts指定第一个play在哪些主机上执行
hosts: servera.lab.example.com
# tasks指定第一个play中都执行哪些内容
tasks:
# 第一个task,调用service模块,启动httpd服务并设置开机启动
- name: start and enabled httpd
service:
name: httpd
enabled: true
state: started
# 第二个play
- name: import test play file and set the variable
import_playbook: plays/test.yml
vars:
url: "http://servera.lab.example.com"

YAML文件语法

  • 字符串
    • 普通字符串可以不加引号,加单引号,加双引号
      如果要引用变量,并且变量在开头,必须使用双引号将整行括起来
    • 多行字符串
      ​|​​ 文本实际是多行,自动将回车符替换成​​\n​​​​>​​ 文本实际是一行,不会对回车符进行处理
  • 列表
    在同一缩进下,使用​​-​​来指定列表
  • 字典
    使用​​key: value​​来指定字典

示例

# 字符串
name: This is a string
name: "This is a string"
name: 'This is a string'
# 列表
hosts:
- servera
- serverb
- serverc
# 字典
name: httpd
port: 443

执行playbook

语法

​ansible-playbook webserver.yml -e "user=root"​

参数

  • ​--limit=serverc​​ 只在serverc上执行
  • ​--syntax-check​​ 检查语法错误
  • ​-e​​ 指定变量
  • ​-C​​ 假装运行 没啥用

playbook的输出和结果

Playbook通常是幂等的,即同一个playbook,无论运行多少次,最终的结果都是一样的。如果被控主机之前已经进行了更改,那么再次运行playbook的时候不会进行变更。

playbook的执行结果

以下是一个​​playbook​​的执行结果示例

[root@localhost ~]# ansible-playbook copy-file.yml 
# 执行的PLAY的名称
PLAY [Using the copy module] **********************************************************************************************
# 执行的TASK名称 以及该TASK在哪些主机上执行及执行结果
TASK [Gathering Facts] ****************************************************************************************************
ok: [serverb.lab.example.com]
ok: [servera.lab.example.com]

TASK [copy files/user.txt to remote host] *********************************************************************************
changed: [serverb.lab.example.com]
changed: [servera.lab.example.com]
# PLAY的执行结果概述
PLAY RECAP ****************************************************************************************************************
servera.lab.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb.lab.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

说明

​TASK​​的执行结果

一般结果

  • ​ok​​ 执行成功,没有进行更改
  • ​changed​​ 执行成功,并且进行了更改
  • ​unreachable​​ 被控主机不可达
  • ​failed​​ 执行失败

流程控制相关

  • ​skipped​​ 不满足执行条件,跳过task不进行执行
  • ​rescued​​​ 在​​block​​运行失败时执行
  • ​ignored​​ 执行失败但忽略错误
举报

相关推荐

0 条评论