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

Ansible批量执行任务有两种方式adhocplaybook,当执行简单的命令时,可以使用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不进行执行
  • rescuedblock运行失败时执行
  • ignored 执行失败但忽略错误

猜你喜欢

转载自blog.51cto.com/13540167/2605646