1042  
查询码:00000077
ansible之文件的批量分发
作者: wyasw 于 2020年03月29日 发布在分类 / Linux / 服务安装 下,并于 2020年03月29日 编辑
ansible

  第1章  ansible之文件的批量分发介绍 

说明信息:

ansible软件相关参考链接信息

http://docs.ansible.com/ansible/intro_installation.html

http://www.ansible.com.cn/

http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

 

python语言是运维人员必会的语言!
ansible
是一个基于Python开发的自动化运维工具
ansible
的功能实现基于SSH远程连接服务
ansible
可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能

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

 

第2章  IP列表

 

服务器说明

外网 IP

内网 IP

主机名

nginx web

10.0.0.7/24

172.16.1.7/24

web01

NFS 存储服务器

10.0.0.31/24

172.16.1.31/24

nfs01

rsync 备份服务器

10.0.0.41/24

172.16.1.41/24

backup

管理服务器

10.0.0.61/24

172.16.1.61/24

m01

 

第3章 必备

实现从管理机m01到其他机器的秘钥认证关系:

3.1  sshpass非交互方式工具使用

 

3.2 开始安装ansible

3.2.1 管理端m01安装ansible

需要epel.repo

[root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

[root@m01 ~]# yum -y install ansible

3.2.2 所有被管理端需要安装:

[root@nfs01 ~]# yum -y install libselinux-python

 

3.2.3  ansible基础配置

ansible的配置文件:

[root@m01 ~]# tree /etc/ansible

/etc/ansible

├── ansible.cfg     ##ansible配置文件

├── hosts          ##被ansible管理的主机名单(分组

└── roles

 

1 directory, 2 files

 

编辑ansible的主机配置文件hosts,添加主机组dong

[root@m01 ~]# cp /etc/ansible/hosts{,.bak}   ##改前备份

[root@m01 ~]# tail -4 /etc/ansible/hosts

[dong]

172.16.1.31

172.16.1.41

172.168.1.7

如果设置了ssh秘钥连接的话,hosts文件到这里就算配置完毕了。但是我们还没有设置,因此还需要对ansible的主机映射文件/etc/ansible/hosts继续加工:

[root@m01 ~]# tail -4 /etc/ansible/hosts

[dong]

172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456

172.16.1.41 ansible_ssh_user=root ansible_ssh_pass=123456

172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456

命令说明:

ansible_ssh_user= ##ssh连接的用户名

ansible_ssh_pass= ##ssh 连接的密码

如果没有做秘钥认证,hosts又没有如上配置的话,ansible进行远程连接是会失败的。

3.2.4 利用ansible远程批量执行命令

语法:

[root@m01 ~]# ansible dong -m command -a 'uptime'
172.16.1.41 | SUCCESS | rc=0 >>
 22:11:10 up 13:18,  2 users,  load average: 0.00, 0.01, 0.05

172.16.1.7 | SUCCESS | rc=0 >>
 22:11:10 up 13:19,  2 users,  load average: 0.00, 0.01, 0.05

172.16.1.31 | SUCCESS | rc=0 >>
 22:11:10 up 13:19,  2 users,  load average: 0.00, 0.01, 0.05

 

ansible 主机组 -m ansible内置功能模块名 -a 命令

 

ansible命令测试

1:获取172.16.1.7的主机的w信息

 

[root@m01 ~]# ansible 172.16.1.7 -m command -a 'w'
172.16.1.7 | SUCCESS | rc=0 >>
 22:17:08 up 13:25,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.253       08:54    2:43m  0.02s  0.02s -bash
root     pts/1    172.16.1.61      22:17    0.00s  0.08s  0.00s /bin/sh -c /usr

 

2:获取整个dong主机组的对应的“w”信息

[root@m01 ~]# ansible dong -m command -a 'w'
172.16.1.7 | SUCCESS | rc=0 >>
 22:18:53 up 13:27,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.253       08:54    2:45m  0.02s  0.02s -bash
root     pts/1    172.16.1.61      22:18    0.00s  0.12s  0.00s /bin/sh -c /usr

172.16.1.41 | SUCCESS | rc=0 >>
 22:18:53 up 13:26,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.253       08:54    1:55m  0.13s  0.09s -bash
root     pts/1    172.16.1.61      22:18    0.00s  0.15s  0.00s /bin/sh -c /usr

172.16.1.31 | SUCCESS | rc=0 >>
 22:18:53 up 13:26,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.253       08:54   50:32   0.07s  0.07s -bash
root     pts/1    172.16.1.61      22:18    0.00s  0.15s  0.00s /bin/sh -c /usr

[root@m01 ~]#

 

3:调用ansible内置的copy模块

[root@m01 ~]# ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp"
172.16.1.7 | SUCCESS => {
    "changed": true, 
    "checksum": "ff4b5d4ed5cbafb5a040fc373380b1ec41c587ea", 
    "dest": "/tmp/hosts", 
    "gid": 0, 
    "group": "root",     ##复制过得的属组
    "md5sum": "ea559d6091b0912670656b94cad67340", 
    "mode": "0644",        ##复制过去的权限
    "owner": "root",   ##复制过去的属主
    "size": 325, 
    "src": "/root/.ansible/tmp/ansible-tmp-1494858256.42-180402520361666/source", 
    "state": "file", 
    "uid": 0
}

[root@m01 ~]# ansible 172.16.1.7 -m command -a "ls /tmp"
172.16.1.7 | SUCCESS | rc=0 >>
ansible_KSKdZG
figer_check.txt
hosts   #拷贝成功

[root@m01 ~]# ssh root@172.16.1.7 "ls /tmp"  ##ssh再查看

root@172.16.1.7's password:

figer_check.txt

hosts

 

命令说明:

-m:调用ansible内置模块 copy 拷贝模块

-a:接命令。由于调用了copy模块,命令格式发生改变。src=本地文件路径 dest=目的地所在路径

 

4:调用copy模块实现保存文件的属性改变

[root@m01 ~]# ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp owner=dong group=dong mode=600"

172.16.1.7 | SUCCESS => {

    "changed": true,

    "checksum": "ff4b5d4ed5cbafb5a040fc373380b1ec41c587ea",

    "dest": "/tmp/hosts",

    "gid": 500,

    "group": "dong",

    "mode": "0600",

    "owner": "dong",

    "path": "/tmp/hosts",

    "size": 325,

    "state": "file",

    "uid": 500

}

 

看这里:

[root@m01 ~]# ssh root@172.16.1.7 "ls -l /tmp/hosts"

root@172.16.1.7's password:

-rw------- 1 dong dong 325 May 15 22:24 /tmp/hosts

 

备注:

copy模块,如果复制的对方主机路径下没有目录,那么会递归创建

特别提示:

ansible的部分模块并不支持

1)        管道符“|

2)        重定向“><>><<”

3)        类似toptail -f这种不能即刻返回明确信息的命令

 

 

3.3 利用ansible远程执行各类脚本

3.3.1 现将脚本分发到各个机器上去

[root@m01 ~]# echo "echo '测试成功'" >> /server/scripts/test.sh

[root@m01 ~]# ansible dong -m copy -a "src=/server/scripts/test.sh dest=/server/scripts/ mode=0755 backup=yes"

172.16.1.31 | SUCCESS => {

    "changed": true,

    "checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",

    "dest": "/server/scripts/test.sh",

    "gid": 0,

    "group": "root",

    "md5sum": "f104259eae2b3edf55af0fa8bd80bb02",

    "mode": "0755",

    "owner": "root",

    "size": 20,

    "src": "/root/.ansible/tmp/ansible-tmp-1494860141.48-129922012369000/source",

    "state": "file",

    "uid": 0

}

172.16.1.7 | SUCCESS => {

    "changed": true,

    "checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",

    "dest": "/server/scripts/test.sh",

    "gid": 0,

    "group": "root",

    "md5sum": "f104259eae2b3edf55af0fa8bd80bb02",

    "mode": "0755",

    "owner": "root",

    "size": 20,

    "src": "/root/.ansible/tmp/ansible-tmp-1494860141.58-207376611936153/source",

    "state": "file",

    "uid": 0

}

172.16.1.41 | SUCCESS => {

    "changed": true,

    "checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",

    "dest": "/server/scripts/test.sh",

    "gid": 0,

    "group": "root",

    "md5sum": "f104259eae2b3edf55af0fa8bd80bb02",

    "mode": "0755",

    "owner": "root",

    "size": 20,

    "src": "/root/.ansible/tmp/ansible-tmp-1494860141.51-186244559952898/source",

    "state": "file",

    "uid": 0

}

[root@m01 ~]#

注意:dest路径的写法,若是不存在的目录,结尾要加斜线(/server/scripts/,否则默认不会创建目标目录

3.3.2 远程批量执行脚本

[root@m01 ~]# ansible dong -m command -a "sh /server/scripts/test.sh"

172.16.1.7 | SUCCESS | rc=0 >>

测试成功

 

172.16.1.31 | SUCCESS | rc=0 >>

测试成功

 

172.16.1.41 | SUCCESS | rc=0 >>

测试成功

[root@m01 ~]# ansible dong -m shell -a "/server/scripts/test.sh"

172.16.1.41 | SUCCESS | rc=0 >>

测试成功

 

172.16.1.31 | SUCCESS | rc=0 >>

测试成功

 

172.16.1.7 | SUCCESS | rc=0 >>

测试成功

 

 

第4章 常用模块:每个模块就是一个功能

模块名

作用

command

执行命令模块(重要)

copy

文件拷贝模块(重要)

shell

执行 shell 脚本模块(重要)

script

执行 shell 脚本模块(重要)

file

设定文件属性模块

service

系统服务管理模块

cron

计划任务管理模块

yum

yum 软件包安装管理模块

synchronize

使用 rsync 同步文件模块

第5章 查看 Ansble的帮助

ansible-doc -l 查看所有的模块

ansible-doc -s service 查看指定模块用法

第6章 记录

         

6.1 企业级生产场景批量管理-自动化管理方案

    最简单/最常用/最强大的选择是ssh key+shell/pssh方案,一般中小型企业会用(50-100台以下规模企业)

           a. 利用ssh key执行命令,并将命令放在脚本里面

           ssh 172.16.1.31 $1

           ssh 172.16.1.41 $1

           ssh 172.16.1.7  $1

              b. 利用ssh key执行命令,将命令放在脚本里面,并加上相应循环语句或判断语句

           for ip in $*

           do

           done             

    . sina cfengine/puppet 较早的批量管理工具;现在基本上没有企业用

    门户级别比较流行的,puppet批量管理工具(复杂/笨重)

    . saltstack 批量管理工具;特点:简单,功能强大(配置复杂)---赶集网/小米/一些CDN公司

    批量管理路线:ssh key-->cfengine-->puppet-->saltstack/ansible      

       PS: 使用ansible软件的前提是ssh key公钥分发完成

 

6.2 如何完成集群规模架构一键自动化实现(步骤说明)

    . 5台服务器先配置好(kickstart,cobbler无人值守安装)。高级实现云计算(按需分配,动态调整)(openstack,kvm)

    . linux基本优化,包括ssh服务(可以自动化实现)。

    创建密钥信息(自动化免交互创建)

        ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

    进行批量分发密钥(sshpass,expect自动化实现)

    . ansible软件安装(可以自动化实现)

    网络服务自动化安装(ansible实现)

        (搭建yum仓库,定制rpm)

 

6.3  ansible基础知识部分补充

    1 ansible软件特点:

           · 可以实现批量管理

              · 可以实现批量部署

              · ad-hoc(批量执行命令)---针对临时性的操作

                ansible dong -m command -a "hostname"   <- 批量执行命令举例

         

              · 编写剧本-脚本(playbook)---针对重复性的操作 (非常重要)

    2 ansible核心功能:

        · pyYAML-----用于ansible编写剧本所使用的语言格式

        · paramiko---远程连接与数据传输       

              · Jinjia2----

              说明:很多ansible的报错都是和python有关,因为ansible的底层开发是利用python编写的

             

6.4  ansible扩展模块功能介绍

    . ansible实现检查被管理服务器端网络连接是否通畅(检查道路是否通畅)

        # ansible dong -m command -a "hostname"    <-- 最开始检查道路是否通畅方法

        # ansible dong -m ping                           <-- 专业检查道路是否通畅方法

        172.16.1.31 | SUCCESS => {

        "changed": false,

        "ping": "pong"

        }

        172.16.1.7 | SUCCESS => {

            "changed": false,

            "ping": "pong"

        }

        172.16.1.41 | SUCCESS => {

            "changed": false,

            "ping": "pong"

        }

              以上信息不清楚,可以通过利用ansible查看帮助信息方法获取新模块功能说明

              # ansible-doc -s ping

        - name: Try to connect to host, verify a usable python and return `pong' on success.

        action: ping

              说明:尝试连接到主机,验证网络连接是否通畅,如果通畅返回pong信息表示成功

                    激活验证功能,利用ping模块

                      

    . ansible实现定时任务功能执行相应的操作(定时任务)

        回顾传统的定时任务为:

        # crontab -l

        #time sync by dong at 2010-2-1

        */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

              说明:日期格式为 分钟:minute,小时:hour,日期:day,月:month,周:weekday 

                    日期格式后面接需要执行的命令或脚本文件

           获取ansible定时任务模块说明信息:

              # ansible-doc -s cron

        - name: Manage cron.d and crontab entries.

                      cron模块主要管理cron.dcrontab条目信息;即实现配置定时任务

          action: cron    激活定时任务功能,利用cron模块

              backup                 # If set, create a backup of the crontab before it is modified. The location of the backup is returned in the `backup_file' variable by this module.

              cron_file              # If specified, uses this file instead of an individual user's crontab. If this is a relative path, it is interpreted with respect to /etc/cron.d. (If it is absolute, it will

                                       typically be /etc/crontab). To use the `cron_file' parameter you must specify the `user' as well.

              day                    # Day of the month the job should run ( 1-31, *, */2, etc )

                                                运行job任务的日期时间信息(编写方式1-31*, */2, )

              disabled               # If the job should be disabled (commented out) in the crontab. Only has effect if state=present

                                                如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目

              env                    # If set, manages a crontab's environment variable. New variables are added on top of crontab. "name" and "value" parameters are the name and the value of environment variable.

                                       如果设置,管理crontab的环境变量信息。新的环境变量信息会被增加到定时任务表顶部。描述或数值会被环境变得的名称或数值所定义

                       hour                   # Hour when the job should run ( 0-23, *, */2, etc )

                                                运行job任务的小时时间信息(编写方式0-23*, */2, )

              insertafter            # Used with `state=present' and `env'. If specified, the environment variable will be inserted after the declaration of specified environment variable.

              insertbefore           # Used with `state=present' and `env'. If specified, the environment variable will be inserted before the declaration of specified environment variable.

              job                    # The command to execute or, if env is set, the value of environment variable. Required if state=present.

                                                执行相应的命令,如果env被设置,将作为环境变量的值,但前提是state=present

              minute                 # Minute when the job should run ( 0-59, *, */2, etc )

                                                运行job任务的分钟时间信息(编写方式0-59**/2,等等)

              month                  # Month of the year the job should run ( 1-12, *, */2, etc )

                                                运行job任务的月份时间信息(编写方式1-12*, */2, )

              name                   # Description of a crontab entry or, if env is set, the name of environment variable. Required if state=absent. Note that if name is not set and state=present, then a new crontab

                                       entry will always be created, regardless of existing ones.

                                                                  定时任务条目的描述信息;如果env被设定了,描述信息将为环境变量信息。前提是定时任务状态为关闭状态

                                                                  注意:如果名称没有被指定并且定时任务状态为开启,那么新的定时任务将总被创建,不管这个定时任务是否存在

              reboot                 # If the job should be run at reboot. This option is deprecated. Users should use special_time.

              special_time           # Special time specification nickname.

                                                指定时间规格绰号

              state                  # Whether to ensure the job or environment variable is present or absent.

                                                确认job或环境变量是开启或是关闭

              user                   # The specific user whose crontab should be modified.

                                                指定修改与编写定时任务的用户信息

              weekday                # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

                                                job任务应该在一周的哪天进行运行(编写方式0-6表示周日到周六,以及用*符号等)

        

        # ansible 172.16.1.7 -a "crontab -l"                  <- 查看当前被管理服务器定时任务文件信息

          172.16.1.7 | SUCCESS | rc=0 >>

          #crond-id-001:time sync by hq

          */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

       

              参考下面编写的定时任务条目,进行编写ansible定时任务命令

              # restart network

              00 00 * * * /etc/init.d/network restart >/dev/null 2>&1

              # ansible 172.16.1.7 -m cron -a "minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "None"

              ]

          }

        # ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: None

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

             

              如果没有定义定时任务描述信息,每次执行ansible创建定时任务,都会被反复创建

              # ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "None",

                  "restart network"

              ]

          }

        # ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: None

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

          #Ansible: restart network

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

               

              利用ansible的模拟检查参数-C,实现模拟检查ansible命令语法格式是否正确,但命令并不会执行产生效果            

              # ansible 172.16.1.7 -C -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

          172.16.1.7 | SUCCESS => {

              "changed": false,

              "envs": [],

              "jobs": [

                  "None",

                  "restart network"

              ]

          }

               

              删除无用的定时任务信息

        # ansible 172.16.1.7 -C -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"  <- 先进行测试,测试成功后再进行删除

           # ansible 172.16.1.7  -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

        # ansible 172.16.1.7  -m cron -a "name='None' state=absent"   <- 指定当前任务名称,即可进行删除操作

             

              临时关闭与开启指定定时任务效果,但不删除定时任务条目

        # ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=yes"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

          [root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: restart network

          #00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

          

              # ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=no"

          172.16.1.7 | SUCCESS => {

              "changed": true,

              "envs": [],

              "jobs": [

                  "restart network"

              ]

          }

          [root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"

          172.16.1.7 | SUCCESS | rc=0 >>

          #Ansible: restart network

          00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

 

6.5  ansible重要模块功能总结         

    command    (重要模块)    执行命令模块,ansible命令执行默认模块

    shell      (重要模块)    执行shell脚本模块

    script    (重要模块)    把脚本发到客户端,然后执行;执行脚本命令在远端服务器上

    copy     (重要模块)    把本地文件发送到远端

    cron    (重要模块)  编写定时任务的模块

    ping                    测试主机连通性的模块;如果同返回 pong

   

 

6.6  : ansible剧本编写规则说明    

6.6.1  pyYAML语法规则:

       规则一:缩进

    yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack/ansible需要每个缩进级别由两个空格组成。一定不能使用tab

    规则二:冒号

    yaml:

    mykey: my_value

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

    规则三:短横线

    想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分 - hosts

   

    核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab

      

    ---

    ### 剧本的开头,可以不写

    - hosts: all       ##处理所有服务器,找到所有服务器;  -(空格)hosts:(空格)all

      tasks:         ##剧本所要干的事情;                (空格)(空格)task:

        - command: echo hello dong linux.        

## (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

             

    剧本编写内容扩展:剧本任务定义名称

       - hosts: 172.16.1.7  ##处理指定服务器                   -(空格)hosts:(空格)all

         tasks:          ##剧本所要干的事情;                (空格)(空格)task:

           - name:

          command: echo hello dong linux.                  (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

 

6.6.2 剧本编写内容扩展:剧本任务编写定时任务

       # ansible all -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"

       - hosts: all

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

    # ansible-playbook -C /etc/ansible/network-restart.yml  -vvvx

       说明:测试剧本命令后面可以跟多个-v进行调试检查

      

       剧本编写内容扩展:剧本任务编写多个任务

       - hosts: all

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

        - name: sync time

          cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

 

       剧本编写内容扩展:剧本任务编写多个主机

       - hosts: 172.16.1.7

      tasks:

        - name: restart-network

          cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'

        - name: sync time

          cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

       - hosts: 172.16.1.31

      tasks:

        - name: show ip addr to file

          shell: echo $(hostname -i) >> /tmp/ip.txt

    **************************************************************************************

扩展知识说明:vim编辑器使用说明

       01:复制当前行到最后一行的内容,然后粘贴到最后一行的后面

           :/172.16.1.31/,$copy$

              :.,$copy$

**************************************************************************************

 

08: ansible剧本编写总结说明

    找什么服务器,让服务器干写什么

       多使用检查命令-C

      

 

6.7 附录01pssh命令使用扩展

=========================================

原文:http://liang3391.blog.51cto.com/178205/732100

参考:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html

 

01pssh命令使用场景说明

    假如同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢?

       在小型企业中通常使用for循环,但是数量巨大时:

       · 一方面不确定操作是否成功一方面不确定操作是否成功

       · 一方面for循环语句性能不好估计且是不是同步并行执行。

       因此需要使用批量并行执行的命令,这类工具比如 pdshmusshcsshdsh等还有下面说明提到的pssh

 

02pssh软件安装部署方式

    通过yum安装pssh软件

           yum install -y pssh    <- pssh软件下载需要依靠epel

              说明:pssh是一个软件大礼包,里面有很多软件命令

              # rpm -ql pssh

        /usr/bin/pnuke

        /usr/bin/prsync

        /usr/bin/pscp.pssh

        /usr/bin/pslurp

        /usr/bin/pssh

              ....省略部分信息....

    通过编译方式安装pssh软件

        wget http://peak.telecommunity.com/dist/ez_setup.py

        python ez_setup.py

        wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz

        tar zxvf pssh-2.2.2.tar.gz

        cd pssh-2.2.2

        python setup.py install

             

03pssh软件使用操作说明(ssh key认证密钥配置完毕)

    pssh工具包主要有5个程序:

    . pssh  多主机并行运行命令

           [root@server pssh-2.2.2]# vim hosts_info.txt

        172.16.1.31:22

        172.16.1.41:22

        172.16.1.7:22             //注意我的端口号不仅是默认的22       

        

        [root@m01 tmp]# pssh -P -h /tmp/hosts_info.txt uptime

        172.16.1.31:  00:05:58 up 3 days, 18:34,  2 users,  load average: 0.00, 0.01, 0.05

        [1] 00:05:58 [SUCCESS] 172.16.1.31:22

        172.16.1.41:  00:05:58 up 9 days, 22:39,  2 users,  load average: 0.00, 0.01, 0.05

        [2] 00:05:58 [SUCCESS] 172.16.1.41:22

        172.16.1.7:  00:05:58 up 9 days, 22:39,  2 users,  load average: 0.00, 0.01, 0.05

        [3] 00:05:58 [SUCCESS] 172.16.1.41:22       

        说明:如果想将执行命令的批量输出信息重定向到一个文件 加-o 目录 选项

              -h HOST_FILE,  --hosts=HOST_FILE       hosts file (each line "[user@]host[:port]")

                       -o OUTDIR,     --outdir=OUTDIR         output directory for stdout files (OPTIONAL)

                       -P,            --print                 print output as we get it

 

    . pscp  把文件并行地复制到多个主机上

        注意 是从服务器端给客户端传送文件:

        [root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network  

              //标示将本地的/etc/sysconfig/network传到目标服务器的/tmp/network

 

    . prsync 使用rsync协议从本地计算机同步到远程主机

        [root@server ~]# pssh -h test.txt -P mkdir /tmp/etc

        [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc

              //标示将本地的/etc/sysconfig目录递归同步到目标服务器的 /tmp/etc目录下,并保持原来的时间戳,使用用户 dongwm

 

    . pslurp 将文件从远程主机复制到本地,pscp方向相反:

        [root@server ~]# pslurp -h test.txt   -L /tmp/test -l root /tmp/network test 

              //标示将目标服务器的/tmp/network文件复制到本地的/tmp/test目录下,并更名为test

        [1] 14:53:54 [SUCCESS] 192.168.9.102 9922

        [2] 14:53:54 [SUCCESS] 192.168.9.104 9922

        [root@server ~]# ll /tmp/test/192.168.9.10

        192.168.9.102/ 192.168.9.104/

        [root@server ~]# ll /tmp/test/192.168.9.102/

        总计 4.0K

        -rw-r--r-- 1 root root 60 2011-04-22 14:53 test

        [root@server ~]# ll /tmp/test/192.168.9.104/

        总计 4.0K

        -rw-r--r-- 1 root root 60 2011-04-22 14:53 test

             

    . pnuke 并行在远程主机杀进程:

        [root@server ~]# pnuke -h test.txt  syslog

              //杀死目标服务器的syslog进程,只要ps进程中出现相关词语 都能杀死

        [1] 15:05:14 [SUCCESS] 192.168.9.102 9922

        [2] 15:05:14 [SUCCESS] 192.168.9.104 9922

=========================================

 



 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-29 20:56:36[当前版本] wyasw 创建版本

  目录
    文艺知识分享平台 -V 4.9.5 -wcp
    京公网安备100012199188号 京ICP备2021030911号