美文网首页
Ansible(二)如何在多台主机上批量执行任务

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

作者: 月饮沙 | 来源:发表于2021-01-06 15:21 被阅读0次

    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 执行失败但忽略错误

    相关文章

      网友评论

          本文标题:Ansible(二)如何在多台主机上批量执行任务

          本文链接:https://www.haomeiwen.com/subject/zoswoktx.html