• ansible批量管理软件部署及剧本


    服务器版本信息:

    Centos6.9

    [root@db02 ~]# uname -a
    Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

    ansible软件介绍

    ansible是一个基于Python开发的自动化运维工具!

    其功能实现基于SSH远程连接服务!

    ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能

    ansible官方资料

    官网:http://www.ansible.com/home

    官网文档:http://docs.ansible.com/ansible/index.html

    ansible软件特点

    •   不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
    •   不需要服务端
    •   依靠大量的模块实现批量管理
    •   配置文件/etc/snsible/ansible.cfg,不用配置

    ansible输出结果的颜色

    • 输出内容显示绿色:表示执行成功,当没有任何改变
    • 输出内容显示黄色:表示执行成功,但对被管理主机进行了改变
    • 输出内容显示红色:表示执行失败

    ansible参数

    命令参数

    参数说明

    -m   MODULE_NAME

    --module-name=MODULE_NAME

    module name to execute (default=command)

    相应名称的模块被执行(默认模块为 command );

    -m后边是模块的名字

    -a   MODULE_ARGS

    --args=MODULE_ARGS

    module arguments

    模块参数信息;

    -a后面是要执行的命令;也可以写一个 ip ,针对一台机器来执行命令

    -C,--check

    don’t make any changes; instead, try to predict some of the changes that may occur

    不做任何改变;反而,只是尝试预言一些可能出现的改变

    --syntax-check

    perform a syntax check on the playbook, but do not execute it 执行语法检查在剧本上,但是并不执行剧本

    ansible部署

    第一步、首先部署ssh+key免密码登陆方式

    ssh+key部署:

    http://www.cnblogs.com/lyq863987322/p/7886344.html  

    第二步、被管理端安装libselinux

    yum install libselinux-python -y

    第三步、服务端安装ansible,配置文件编写

    yum install ansible -y

    ansible的重要目录

    /etc/ansible/hosts                  --- 定义anisble软件可以管理的主机信息

    /usr/bin/ansible                     --- ansible执行命令

    /usr/bin/ansible-playboot      --- ansible执行剧本命令

    /etc/ansible/hosts                 配置文件编写举例

    在配置文件中添加被管理主机的ip模块

    [name]
    172.16.1.21
    172.16.1.11
    172.16.1.1
    在/etc/ansible/host文件最后添加[]下面接想要管理的主机ip,[]中起任意名字

    测试控制这三台主机

    命令语法:

    ansible  name -m shell -a "hostname"
    ansible ---- 命令
    name   ---- 主机模块名称
    -m       ---- 指定模块的参数
    shell     --- 模块名称(不同模块不同名称)
    -a         --- 指定利用模块执行的动作参数
    "hostname"   ---- 在被控主机上批量执行的操作 
    命令格式
    [root@m01 scripts]# ansible name -m shell -a "hostname"
    
    172.16.1.21 | SUCCESS | rc=0 >>
    
    backup
    
    172.16.1.11 | SUCCESS | rc=0 >>
    
    nfs01
    
    172.16.1.1 | SUCCESS | rc=0 >>
    
    web01

    这样就已经可以批量控制多台主机了,主要配置中需要注意的是ssh+key的配置。

    如果没有配置ssh+key密钥分发的话,可以在/etc/ansible/host文件配置管理主机的时候 在ip后面空格接:ansible_ssh_user=用户 ansible_ssh_pass=密码,这样也可以管理

    ansible几个常用模块

    ansible帮助:

    ansible-doc -l         ---列出所有模块信息
    ansible-doc -s 模块名   ---看执行模块信息

    常用模块

    模块说明

    command  (重要模块)

    执行命令模块,ansible命令执行默认模块

    shell  (重要模块)

    执行shell脚本模块

    script  (重要模块)

    把脚本发到客户端,然后执行;执行脚本命令在远端服务器上

    copy   (重要模块)

    把本地文件发送到远端

    file

    设定文件属性模块

    service

    系统服务管理模块

    cron

    计划任务管理模块

    yum

    yum软件包安装管理模块

    mount

    挂载模块

    synchronize

    使用rsync同步文件模块

    command模块

    ansible中的远程执行命令模块

    • 命令模块中的多个参数设置用空格进行分隔 
    • 命令模块中不能出现"<" ">" "|" ";" "&"

    参数

    说明

    chdir

    在执行命令之前,通过cd命令进入到指定目录中
    # ansible oldboy -m command -a "chdir=/tmp ls"

    creates

    定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤
    - name: Run the command if the specified file does not exist.
    command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

    executable

    改变shell使用command进行执行,并且执行时要使用绝对路径

    free_form

    free_form

    命令模块采用自由形式命令运行;即可以输入任意linux命令

    removes

    定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

    warn
    (added in 1.8)

    如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

    实例:

    chdir参数:在执行命令之前,通过cd命令进入到指定目录

    [root@m01 scripts]# ansible oldboy -m command -a "chdir=/tmp pwd"
    
    172.16.1.21 | SUCCESS | rc=0 >>
    
    /tmp
    
    172.16.1.11 | SUCCESS | rc=0 >>
    
    /tmp
    
    172.16.1.1 | SUCCESS | rc=0 >>
    
    /tmp
    chdir参数

    creates参数:定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤

    [root@m01 scripts]# ansible name -m command -a "pwd creates=/tmp/oldboy.txt"
    
    172.16.1.21 | SUCCESS | rc=0 >>
    
    /root
    
    172.16.1.11 | SUCCESS | rc=0 >>
    
    /root
    
    172.16.1.1 | SUCCESS | rc=0 >>
    
    /root
    command模块creates参数

    shell模块

    参数

    说明

    chdir

    在执行命令之前,通过cd命令进入到指定目录中
    # ansible oldboy -m command -a "chdir=/tmp ls"

    creates

    定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤
    - name: Run the command if the specified file does not exist.
      command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

    executable

    改变shell使用command进行执行,并且执行时要使用绝对路径

    free_form

    free_form

    命令模块采用自由形式命令运行;即可以输入任意linux命令

    removes

    定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

    warn
    (added in 1.8)

    如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

     shell模块类似于command模块,最大区别是shell模块可以执行脚本

    [root@m01 scripts]# ansible name -m shell -a "sh /server/scripts/name.sh"
    172.16.1.21 | SUCCESS | rc=0 >>
    nfs01
    
    172.16.1.11 | SUCCESS | rc=0 >>
    backup
    说明:shell模块在远程执行脚本时,远程主机上一定要有相应脚本 
    shell脚本执行

     script模块

    在本地执行脚本时,将脚本中的内容传输到远程节点上运行

    creates
    (added in 1.5)

    定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤
    - name: Run the command if the specified file does not exist.

    command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

    free_form

    命令模块采用自由形式命令运行;即可以输入任意linux命令

    removes
    (added in 1.5)

    定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

     实例:

    [root@m01 scripts]# ansible name -m script -a "/tmp/name.sh"
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.16.1.21 closed.
    ", 
        "stdout": "nfs01
    ", 
        "stdout_lines": [
            "nfs01"
        ]
    }
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.16.1.11 closed.
    ", 
        "stdout": "backup
    ", 
        "stdout_lines": [
            "backup"
        ]
    }
    说明:不需要将脚本传输到远程节点上,脚本本身不用进行授权,即可利用script模块批量执行脚本
    View Code

    copy模块

    将本地数据传输到远端,或者将远程节点上的数据进行移动

    选项参数

    选项说明

    backup (重要参数)

    创建备份文件包含时间戳信息,以便能够还原回原文件,在某种情况原文件被覆盖错误时。

    content

    当使用代替src参数时,将文件的内容直接设置为指定值。远端创建有指定内容文这是只是简单值,对于任何复杂或者有格式化的内容,请切换到template模块

    dest

    文件应该被拷贝到的远程绝对路径信息。如果src是一个目录,dest也必须是目录

    directory_mode
    (added in 1.5)

    当递归复制设置目录权限时,如果没有设置权限,将使用系统默认这个权限值设置在目录上只对于最近创建的,并且对于已经存在的没有效果

    force

    默认为yes,当远程文件内容和源文件内容不同时,将覆盖目标文件如果为no,文件将只被传输,在目标主机不存在此文件时

    别名:thirsty

    group

    定义所拥有文件/目录的所属组名称,类似交由chown命令进行处理

    mode

    定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。作为1,8版本,可以指定为符号模式(如 u+rwx or u=rw,g=r,o=r)

    owner

    定义所拥有文件/目录的所属用户名称,类似交由chown命令进行处理

    src

    本地路径文件复制到远程服务器;可以是绝对路径也可以是相对路径如果路径是一个目录,将会递归复制。在这种情况下,如果路径以“/”结束,只将在该目录的内容复制到目的地否则,如果它不以“/”结束,目录和目录下所有内容都会被复制以上这种复制方式类似于rsync

    remote_src

    如果这个值设置为True,将到远程目标主机的机器上搜索

    validate

    在文件复制到相应目录位置之前,运行验证命令要验证的文件的路径通过%s传递,并且要在下面的例子中显示

    实例:

    [root@m01 scripts]# ansible name -m copy -a "src=/etc/hosts dest=/tmp/ mode=0777" 
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", 
        "dest": "/tmp/hosts", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "2253445a36ed3910d50887a6eb1e4b79", 
        "mode": "0777", 
        "owner": "root", 
        "size": 393, 
        "src": "/root/.ansible/tmp/ansible-tmp-1508394462.54-228657061248374/source", 
        "state": "file", 
        "uid": 0
    }
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "checksum": "da5234fc498b2c3bf8b98f6b08fe1d6d96e653c2", 
        "dest": "/tmp/hosts", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "2253445a36ed3910d50887a6eb1e4b79", 
        "mode": "0777", 
        "owner": "root", 
        "size": 393, 
        "src": "/root/.ansible/tmp/ansible-tmp-1508394462.62-205181338927486/source", 
        "state": "file", 
        "uid": 0
    }
    View Code

    说明:

    1. 如果指定的目标目录不存在,系统会自动创建,否则源目录会放到目标目录下面去

    2. 如果copy的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于copy过去后在重命名;

    3. 如果dest是目标机器上已经存在的目录,则会直接把文件copy到该目录下面。

    4. 设定的用户和组oldboy在所有客户端必须存在

     给文件加内容:

    [root@m01 scripts]# ansible name -m copy -a "content=lyq.com
     dest=/tmp/1"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/1", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "mode": "0644", 
        "owner": "root", 
        "size": 7, 
        "src": "/root/.ansible/tmp/ansible-tmp-1508465641.79-151255543511039/source", 
        "state": "file", 
        "uid": 0
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/1", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "mode": "0644", 
        "owner": "root", 
        "size": 7, 
        "src": "/root/.ansible/tmp/ansible-tmp-1508465641.82-210493742853029/source", 
        "state": "file", 
        "uid": 0
    }
    View Code

    file模块

    设置文件属性

    参数

    说明

    force

    强行创建符号链接的两种情况:

    源文件不存在(但是日后会出现)

    目标存在并且是一个文件(因此,我们需要将“路径”文件取消,并创建“src”文件的符号链接)

    group

    定义所拥有文件/目录的所属组名称,类似交由chown命令进行处理

    mode

    定义文件或目录的权限信息;就像使用/usr/bin/chmod 设定八进制数(如0644)取消掉前导零可能会有意想不到的结果。作为1,8版本,可以指定为符号模式(如 u+rwx or u=rw,g=r,o=r)

    owner

    定义所拥有文件/目录的所属用户名称,类似交由chown命令进行处理

    path

    文件路径管理:

    别名方式:dest,name

    recurse

    递归设置指定文件属性(这个参数值应用对于state=directory)

    src

    要链接的文件路径(只能应用 state=link),接受绝对 相对以及不存在的路径相对路径不能扩展

    state

    (重要参数)

    如果指定参数为directory
    # 所有不存在的子目录将会被创建,并且从1.7开始支持设置目录权限
    如果指定参数为file
    # 如果文件不存在将不能被创建,如果想创建可以参考copy和template模块
    如果指定参数为link
    # 符号链接将被创建或更改。
    如果指定参数为hard
    # 便会创建出硬链接
    如果指定参数为absent
    # 目录将被递归删除以及文件,而链接将被取消链接。
    # 请注意,定义文件不存在不会失败,只是输出没有发生任何改变的结果
    如果指定参数为touch
    # 如果路径不存在将创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间(类似于“touch”从命令行工作的方式)。

    实例:

    创建目录/删除目录

    [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=directory"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "gid": 0, 
        "group": "root", 
        "mode": "0755", 
        "owner": "root", 
        "path": "/tmp/oldboy_dir", 
        "size": 4096, 
        "state": "directory", 
        "uid": 0
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "gid": 0, 
        "group": "root", 
        "mode": "0755", 
        "owner": "root", 
        "path": "/tmp/oldboy_dir", 
        "size": 4096, 
        "state": "directory", 
        "uid": 0
    }
    [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_dir state=absent"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_dir", 
        "state": "absent"
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_dir", 
        "state": "absent"
    }
    View Code

    创建文件/删除文件

    [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=touch"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/oldboy_file", 
        "gid": 0, 
        "group": "root", 
        "mode": "0644", 
        "owner": "root", 
        "size": 0, 
        "state": "file", 
        "uid": 0
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/oldboy_file", 
        "gid": 0, 
        "group": "root", 
        "mode": "0644", 
        "owner": "root", 
        "size": 0, 
        "state": "file", 
        "uid": 0
    }
    [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file state=absent"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_file", 
        "state": "absent"
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_file", 
        "state": "absent"
    }
    View Code

    创建软连接/删除软连接

    [root@m01 scripts]# ansible name -m file -a "src=/tmp/lyq_file dest=/tmp/lyq_file_link state=link"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/oldboy_file_link", 
        "gid": 0, 
        "group": "root", 
        "mode": "0777", 
        "owner": "root", 
        "size": 16, 
        "src": "/tmp/oldboy_file", 
        "state": "link", 
        "uid": 0
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/oldboy_file_link", 
        "gid": 0, 
        "group": "root", 
        "mode": "0777", 
        "owner": "root", 
        "size": 16, 
        "src": "/tmp/oldboy_file", 
        "state": "link", 
        "uid": 0
    }
    [root@m01 scripts]# ansible name -m file -a "dest=/tmp/lyq_file_link state=absent"
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_file_link", 
        "state": "absent"
    }
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "path": "/tmp/oldboy_file_link", 
        "state": "absent"
    }
    View Code

    fetch模块

    将远程主机上的文件,拉取到本地

    参数

    说明

    dest

    定义一个保存文件的目录(将远程主机拉去过来的文件保存在本地的路径信息)

    src

    指定从远程主机要拉取的文件信息

    flat

    默认设置为no,如果设置为yes,将不显示路径信息

     实例:

    从远程主机拉取文件

    [root@m01 scripts]# ansible name -m fetch -a "dest=/tmp src=/tmp/1"
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/172.16.1.11/tmp/1", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "remote_md5sum": null
    }
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/172.16.1.21/tmp/1", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "remote_md5sum": null
    }
    View Code

    flat  默认设置为no,如果设置为yes,将不显示路径信息

    [root@m01 scripts]# ansible name -m fetch -a "dest=/tmp/ src=/tmp/1 flat=yes"
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/1", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "remote_md5sum": null
    }
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "dest": "/tmp/1", 
        "md5sum": "ae41cc8f2c5a90e7e94b1d9f6616a916", 
        "remote_checksum": "31f9b45eca1a36069a4517868a948b369228aa75", 
        "remote_md5sum": null
    }
    View Code

    mount模块

    控制激活和配置挂载点模块

    参数

    说明

    fstype

    指定挂载文件类型

    path

    指定挂载点

    opts

    设定挂载的参数选项信息

    src

    要被挂载的目录设备信息(共享目录)

    boot
    (added in 2.2)

    确定是否在启动时文件系统被挂载
    只应用在solaris系统上

    dump

    Dump(参见 fstab5)。注意如果设置为null或状态设置为present,它将停止工作,并将在随后的运行中复制条目
    对solaris系统没有效果

    state

    如果为mounted在fstab文件中的设备将被激活挂载和适当配置

    # 如果为unmounted设备将被卸载并不会改变fstab文件信息bsent和present只处理fstab,但不影响目前的挂载

     cron模块

    定时任务模块

    参数

    说明

    minute

    hour

    day

    month

    weekday

    job

    定时任务中要执行的操作

    name

    定义定时任务的描述信息

    state=absent

    删除定时任务

    disabled

    注释定时任务

    实例:

    创建定时任务

    [root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null'" 
    172.16.1.21 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "None"
        ]
    }
    172.16.1.11 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "None"
        ]
    }
    View Code

    删除定时任务

    [root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=absent"
    View Code

    注释定时任务

    [root@m01 ~]# ansible name -m cron -a "minute=0 hour=0 job='/bin/sh /tmp/name.sh >/dev/null' state=disabled"
    View Code

    user模块

    管理用户账户

    参数

    说明

    append

    如果为yes,将只添加组,而不是将它们设置为组中的列表

    name

    要操作的用户名称

    shell

    指定用户的使用命令路径(如:/bin/bash)

    comment

    可选设置用户账号描述信息(又称为 GECOS)

    createhome

    除非设置为no,否则当创建账户或不存在主目录时,将为用户创建一个主目录

    user

    创建,移除或修改的用户名称信息
    别名:user

    uid

    可选设置用户UID信息

     实例:

    [root@m01 ansible-playbook]# ansible 172.16.1.1 -m user -a "user=lyq uid=2222"
    172.16.1.1 | SUCCESS => {
        "append": false, 
        "changed": true, 
        "comment": "", 
        "group": 500, 
        "home": "/home/lyq", 
        "move_home": false, 
        "name": "lyq", 
        "shell": "/bin/bash", 
        "state": "present", 
        "uid": 2222
    }
    View Code

    ansible剧本

     检查剧本:

    ansible-playbook --syntax-check 剧本名    ----进行剧本配置信息语法检查

    ansible-playbook -C 剧本名                ----模拟剧本执行

    ansible核心功能

    • pyYAML  -----用于ansible编写剧本所使用的语言格式
    • paramiko ---远程连接与数据传输
    • Jinja2        -----用于编写ansible的模块信息

    ansible剧本编写规则

    pyYAML语法规则

    一:缩进

    yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成。一定不能使用tab键(tab在vim编辑中是8个空格)

    二:冒号

    每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)

    三:短横线

    • 想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分。
    • 核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的。

    ansible-playbook编写格式

    剧本开头,可以不写

    这两项必须要写:

    - hosts:(空格)all   处理所有服务器,找到所有服务器
      tasks:            剧本要干的事

    检查剧本命令

    ansible-playbook --syntax-check 剧本   ----进行剧本配置信息语法检查
    ansible-playbook -C 剧本               ----模拟剧本执行

    剧本实例

    rsync一键部署剧本

    - name: 后面是可以加入提示信息的

    [root@m01 ansible-playbook]# vim rsync.yml
    - hosts: 172.16.1.21
      tasks:
        - name:
          yum: name=rsync state=installed
        - name:
          copy: src=/tmp/rsyncd.conf dest=/etc/
        - name:
          shell: userdel -r rsync && useradd rsync -M -s /sbin/nologin
        - name:
          shell: mkdir -p /backup/ && chown rsync.rsync /backup
        - name:
          copy: src=/tmp/rsync.password dest=/etc/
        - name:
          shell: rsync --daemon creates=/var/run/rsyncd.pid
    - hosts: 172.16.1.11
      tasks:
        - name:
          copy: content=lyq123 dest=/etc/rsync.password

    写的不好的地方,请大家多多包涵

  • 相关阅读:
    Spring中的AOP(五)——定义切入点和切入点指示符
    Java获取URL对应的资源
    最简单的视频网站(JavaEE+FFmpeg)
    Android 为应用添加数字角标
    ViewTreeObserver简介
    Android中pendingIntent的深入理解
    在Windows的CMD中如何设置支持UTF8编码?
    android中角标的实现
    ANDROID SHAPE画圆形背景_ANDROID实现角标布局
    Android 学习之 开源项目PullToRefresh的使用
  • 原文地址:https://www.cnblogs.com/lyq863987322/p/8033811.html
Copyright © 2020-2023  润新知