简介:
 
  ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
 
  ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
    (1)、连接插件connection plugins:负责和被监控端实现通信;
    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    (3)、各种模块核心模块、command模块、自定义模块;
    (4)、借助于插件完成记录日志邮件等功能;
    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
 
部署:
 
  1、部署ssh key

#创建秘钥
ssh-keygen -t dsa
#分发公钥
ssh-copy-id -i /root/.ssh/id_dsa.pub -p 22 root@172.20.10.3
#秘钥登录测试
ssh root@172.20.10.3 "hostname -i"
#免交互创建秘钥【用于脚本创建】
ssh-keygen -t dsa -f ~/.ssh/id_rsa -N "" -q
#-t指定秘钥类型 -f指定秘钥文件保存的路径 -N免交互方式指定密码信息 -q不输出信息,减少信息输出

  ssh服务分发公钥执行过程

  ①. 管理服务器创建私钥和公钥(密钥对)

  ②. 将公钥文件远程传送复制到被管理服务器相应用户~/.ssh/id_dsa.pub下,并修改.ssh目录权限为700

  ③. 修改公钥文件文件名称为authorized_keys,授权权限为600

  ④. 利用ssh服务配置文件的配置参数,进行识别公钥文件authorized_keys

  ⑤. 进而实现基于密钥远程登录服务器(免密码登录/非交互方式登录)

   解决分发公钥时需要的交互问题
  

sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub root@172.20.10.5 -o StrictHostKeyChecking=no
#sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码【sshpass可通过yum或编译安装】
#-p 参数指定明文密码【密码与-p之间不能有空格

  

  2、部署ansible

#该软件是用来对selinux进行设置的,确保即使服务器selinux服务开启,依旧能够通过ansible 软件管理
yum install libselinux-python -y
#安装ansible软件
yum install ansible -y
#修改hosts文件
cat >>/etc/ansible/hosts<<EOF
[test]
172.20.10.5
172.20.10.3
EOF

  hosts文件参数介绍:

  1.中括号中的名字代表组名

  2.主机(hosts)部分可以使用域名、主机名、IP地址表示;一般此类配置中多使用IP地址

  3.组名下的主机地址就是ansible可以管理的地址

ansible部署完成!

 
  3、实践
    ansible部分文件介绍 
      

/etc/ansible/hosts 定义anisble软件可以管理的主机信息
/usr/bin/ansible ansible执行命令
/usr/bin/ansible-playboot ansible执行剧本命令
/etc/ansible/ansible.cfg ansible配置文件
/etc/ansible/roles 主要在自动化的时候部署多台主机时使用
   
  
  3.1、远程批量执行命令

    语法:

    ansible clsn -a "uptime"

   ansible clsn -m command -a "uptime"

   ansible 定义的组/单个ip/域名/all  -m command -a "uptime"

    说明:-m 指定使用的模块

    -a 指定使用模块中相应的命令参数

        命令参数只能是基本命令,并不支持管道操作

      all   为hosts文件中的组全部管理

 
  3.2、未分发公钥如何实现远程管理主机及指定ansible端口信息

    配置hosts文件时配置上密码

      IP:端口 用户 密码

vim /etc/ansible/hosts

[test]
172.20.10.3:50001 ansible_ssh_user=root ansible_ssh_pass=123456
172.20.10.5

    指定端口 用户名

[test]
www.test.com:50001 ansible_ssh_user=root

    测试修改端口后的结果 使用ping 模块

[root@localhost ansible]# ansible test -m ping
172.20.10.5 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.20.10.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}

  3.3、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, -checks

don't make any changes, instead, try to predict some of the changes that may

occurs

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

-syntax-checks

perform a syntax check on the playbook, but do not execute ii*>

执行语法检查在剧本上,但是并不执行剧本

  3.4、ansible命令执行结果色彩说明
      绿色:表示没有发生任何改变
      红色:执行命令操作出现异常
      黄色:执行命令后,对受控主机产生影响,发生了配置改变
  3.5、command命令常用参数说明

参数

参数说明

chdir

在执行命令之前,通过cd命令进入到指定目录中

# ansible clsn -m command -a "chdir=/tmp ls"

create

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

executable

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

free_form

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

removes

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

warn

(added in 1.8)

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

    举例:

      [root@localhost ~]# ansible test -m command -a "chdir=/tmp pwd"【不指定模块的时候默认使用的模块就是command】
      172.20.10.5 | SUCCESS | rc=0 >>
      /tmp

      172.20.10.3 | SUCCESS | rc=0 >>
      /tmp

    3.5.1、shell模块

      [root@localhost ~]# ansible test -m shell -a "/bin/bash /root/test.sh"
      172.20.10.3 | SUCCESS | rc=0 >>
      10.3

      172.20.10.5 | SUCCESS | rc=0 >>
      10.5

    3.5.2、script模块【使用scripts模块,不用将脚本传输到远程节点,脚本本身不用进行授权,即可利用script模块执行。直接执行脚本即可,不需要使用sh】

[root@localhost ~]# ansible test -m script -a "/root/free.sh"
172.20.10.5 | SUCCESS => {
"changed": true,
"rc": ,
"stderr": "Shared connection to 172.20.10.5 closed.\r\n",
"stdout": " total used free shared buff/cache available\r\nMem: 976M 163M 618M 7.0M 194M 645M\r\nSwap: 1.0G 0B 1.0G\r\n",
"stdout_lines": [
" total used free shared buff/cache available",
"Mem: 976M 163M 618M 7.0M 194M 645M",
"Swap: 1.0G 0B 1.0G"
]
}
172.20.10.3 | SUCCESS => {
"changed": true,
"rc": ,
"stderr": "Shared connection to 172.20.10.3 closed.\r\n",
"stdout": " total used free shared buff/cache available\r\nMem: 976M 165M 616M 7.0M 194M 642M\r\nSwap: 1.0G 0B 1.0G\r\n",
"stdout_lines": [
" total used free shared buff/cache available",
"Mem: 976M 165M 616M 7.0M 194M 642M",
"Swap: 1.0G 0B 1.0G"
]
}

   3.5.3、copy模块 把本地文件发送到远端

选项参数

选项说明

backup(重要参数)

在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no

content

用于替代"src”,可以直接设定指定文件的值

dest

必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode

递归设定目录的权限,默认为系统默认权限

forces

如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖。

如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes。别名:thirsty

others

所有的file模块里的选项都可以在这里使用

src

被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

mode

定义文件或目录的权限;注意:是4位

owner

修改属主

group

修改属组

           说明: src和content不能同时使用
    copy模块实践: 
#使用copy模块,将free.sh文件传输到各个服务器送,权限修改为0600,属主www属组为root
ansible test -m copy -a "src=/root/free.sh dest=/opt/ mode=0600 owner=www group=root"
#复制远程主机上的文件remote_src=true参数
ansible test -m copy -a "src=/opt/free.sh dest=/home/www/ remote_src=true"
#重新定义文件内容,类似于重定向>
ansible test -m copy -a "content=test.com dest=/opt/free.sh"
#查看文件内容
[root@localhost ~]# ansible test -m shell -a "cat /opt/free.sh"
172.20.10.5 | SUCCESS | rc= >>
test.com 172.20.10.3 | SUCCESS | rc= >>
test.com

    3.5.4、file模块【设置文件属性】

      常用参数:

参数

参数说明

owner

设置复制传输后的数据属主信息

group

设置复制传输后的数据属组信息

mode

设置文件数据权限信息

dest

要创建的文件或目录命令,以及路径信息

src

指定要创建软链接的文件信息

state

state参数信息

directory

创建目录

file

创建文件

link

创建软链接

hard

创建出硬链接

absent

目录将被递归删除以及文件,而链接将被取消链接

touch

创建文件;如果路径不存在将创建一个空文件

      file模块实践:  
#创建目录
ansible test -m file -a "dest=/opt/test_dir state=directory"
#创建文件
ansible test -m file -a "dest=/opt/test.sh state=touch"
#创建软链接
ansible test -m file -a "src=/bin/bash dest=/opt/bash_link state=link"
#删除目录和文件
ansible test -m file -a "dest=/opt/test_dir state=absent"
#创建多级目录
ansible test -m copy -a "src=/etc/hosts dest=/opt/1/2/3/4/5/"

PS:重命名和创建多级目录不能同时实现

    3.5.4、fetch模块【拉取文件】
      参数说明:

参数

参数说明

dest

将远程主机拉取过来的文件保存在本地的路径信息

src

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

flat

默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息

       fetch模块实例:
        

#拉去远程主机上的文件至本地主机
[root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/"
172.20.10.5 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/opt/172.20.10.5/opt/abc",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
172.20.10.3 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/opt/172.20.10.3/opt/abc",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
} #flat参数,拉去的时候不创建目录(同名文件会覆盖)
[root@localhost ~]# ansible test -m fetch -a "src=/opt/abc dest=/opt/ flat=yes"
172.20.10.5 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/opt/abc",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
172.20.10.3 | SUCCESS => {
"changed": false,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/opt/abc",
"file": "/opt/abc",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e"
}

    3.5.4、mount模块【配置挂载点】

      参数详情:
      

参数

参数说明

fstype

指定挂载文件类型 -t nfs == fstype=nfs

opts

设定挂载的参数选项信息 -o ro  == opts=ro

path

挂载点路径          path=/mnt

src

要被挂载的目录信息  src=172.16.1.31:/data

state

state状态参数

unmounted

加载/etc/fstab文件 实现卸载

absent

在fstab文件中删除挂载配置

present

在fstab文件中添加挂载配置

mounted

1.将挂载信息添加到/etc/fstab文件中

2.加载配置文件挂载

      mount模块实例:
#挂载
[root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/ src=172.16.1.31:/data/ state=mounted"
172.16.1.8 | SUCCESS => {
"changed": true,
"dump": "",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt/",
"opts": "rw",
"passno": "",
"src": "172.16.1.31:/data/"
} #卸载
[root@m01 tmp]# ansible 172.16.1.8 -m mount -a "fstype=nfs opts=rw path=/mnt/ src=172.16.1.31:/data/ state=unmounted"
172.16.1.8 | SUCCESS => {
"changed": true,
"dump": "",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt/",
"opts": "rw",
"passno": "",
"src": "172.16.1.31:/data/"
}

    3.5.4、cron模块

参数

参数说明

minute  分

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

hour    时

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

day     日

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

month   月

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

weekday 周

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

job

工作 ;要做的事情

name

定义定时任务的描述信息

disabled

注释定时任务

state

state 状态参数

absent

删除定时任务

present

创建定时任务

默认为present

       cron实例模块详解:

添加定时任务

[root@m01 ~]# ansible clsn -m cron -a "minute=0 hour=0 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null' name=clsn01"
172.16.1.8 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"clsn01"
]
}

删除定时任务

[root@m01 ~]# ansible clsn -m cron -a "minute=00 hour=00 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null' name=clsn01 state=absent"
172.16.1.8 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}

只用名字就可以删除

[root@m01 ~]# ansible clsn -m cron -a "name=clsn01  state=absent"
172.16.1.31 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}

注释定时任务

注意: 注释定时任务的时候必须有job的参数

[root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null'  disabled=yes"
172.16.1.31 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"clsn01"
]
}

取消注释

[root@m01 ~]# ansible clsn -m cron -a "name=clsn01 job='/bin/sh  /server/scripts/hostname.sh &>/dev/null'  disabled=no"
172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"clsn01"
]
}
 
      3.5.4、yum模块

参数

参数说明

name=name

指定安装的软件

state=installed

安装

        yum模块实践:
#安装lrzsz服务
[root@localhost ~]# ansible test -m yum -a "name=lrzsz state=installed"
172.20.10.3 | SUCCESS => {
"changed": true,
"msg": "",
"rc": ,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.tuna.tsinghua.edu.cn\n * extras: mirrors.tuna.tsinghua.edu.cn\n * updates: mirrors.tuna.tsinghua.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n lrzsz x86_64 0.12.20-36.el7 base 78 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 78 k\nInstalled size: 181 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : lrzsz-0.12.20-36.el7.x86_64 1/1 \n Verifying : lrzsz-0.12.20-36.el7.x86_64 1/1 \n\nInstalled:\n lrzsz.x86_64 0:0.12.20-36.el7 \n\nComplete!\n"
]
}
 
      3.5.4、service模块【服务管理】

参数

参数说明

name=service name

服务的名称

state=参数

停止服务 服务状态信息为过去时

stared/stoped/restarted/reloaded

enabled=yes

设置开机自启动

               说明 :service 管理的服务必须存在在/etc/init.d/下有的服务脚本
         service模块实践:
          

#重启crond服务
ansible test -m service -a "name=crond state=restarted"

    3.6、ansible常用模块

常用模块

模块说明

command  (重要模块)

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

shell    (重要模块)

行shell脚本模块

script   (重要模块)

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

copy      (重要模块)

把本地文件发送到远端

file

设定文件属性模块

services

系统服务管理模块

cron

计划任务管理模块

yum

yum软件包安装管理模块

synchronize

使用rsync同步文件模块

mount

挂载模块

     3.7、其他模块补充
#hostname 修改主机名模块
ansible 172.20.10.5 -m hostname -a "name=test1" #selinux 管理模块
ansible 172.16.1.8 -m selinux -a "state=disabled" #get_url 模块 == 【wget】
ansible 172.16.1.8 -m get_url -a "url=http://lan.znix.top/RDPWrap-v1.6.1.zip dest=/tmp/"   url=下载文件的地址dest下载到哪里
  timeout 超时时间
  url_password 密码
  url_username 用户名
 
 
 
 参考链接:https://www.cnblogs.com/clsn/p/7743792.html#auto_id_93
 
 

ansible服务的部署与使用的更多相关文章

  1. ansible服务部署与使用

    第1章 ssh+key实现基于密钥连接(ansible使用前提) 说明:    ansible其功能实现基于SSH远程连接服务    使用ansible需要首先实现ssh密钥连接 1.1 部署ssh ...

  2. ansible服务及剧本编写

    第1章 ansible软件概念说明 python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack).其功能实现基于SSH远程连接服务:ansi ...

  3. ansible的安装部署及简单应用

    Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack.Ansible 是通过 Python 语言开发.Ansible 平台由 Mi ...

  4. Jenkins +svn +maven +tomcat+ ansible 自动化批量部署

    Jenkins +svn +maven +tomcat+ ansible 自动化批量部署 一.部署svn yum install subversion 先创建目录 mkdir /home/svn 创建 ...

  5. 内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

    Ngrok为何物 “ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放.”这是百度百科上给Ng ...

  6. ansible服务模块和组模块使用

    本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...

  7. FTP&samba 服务简单部署

    第1章 FTP服务部署 在Linux下,我们应用最广泛的FTP服务程序是 vsftpd ( TCP端口:而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与 ...

  8. 如何优雅的利用Windows服务来部署ASP.NET Core程序

    上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足 ...

  9. SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)

    1.概念:Eureka 服务发现框架 2.具体内容 对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操 ...

随机推荐

  1. eclipse的应用和整理

    1如何在eclipse中获取动态项目的绝对路径 1.鼠标选中项目,右击菜单,选择properties2.出来弹出框,选择resource,location的值就是你想要的项目绝对路径 JSP中获得当前 ...

  2. java调用c#dll文件配置

    1 在强大的c#语言和java语言之间,二者难免会因为某些特殊的要求会相互调用. 下面就以java调用c#的dll为例做详细介绍 1  在vs中的环境设置如下图,图片中程序仅作为讲解程序,在项目编译成 ...

  3. Format - DateTime

    1. Long Date/Short Date/Long Time/Short Time,可以在系统的“Region and Language”中找到相应设置: 2. ISO Format/Local ...

  4. Aligning Plots in a Column作图列对齐

    Plot[Sin[x], {x, 0, Pi}] Plot[10000 Sin[x], {x, 0, Pi}] 直接作图左边无法对齐,影响图的美观.可以使用左边界空格实现列对齐,代码如下: optio ...

  5. 安装adobe,路径My Pictures或卷无效。请重新输入。

    问题:安装adobe reader时,路径My Pictures或卷无效.请重新输入.我的光驱是D盘.因为是在虚拟机下安装的xp系统. 解决办法: GHOST WINXP2 My Pictures一般 ...

  6. Laravel SMS 短信发送包

    Laravel Sms Laravel 贴合实际需求同时满足多种通道的短信发送组件 我们基于业务需求在 overtrue/easy-sms 基础进行扩展开发,主要实现如下目标: 支持短信验证码直接在 ...

  7. 再学UML-UML用例建模解析(二)

    (1) 关联关系 关联关系是指执行者与用例之间的关系,又称为通信关系,如果某个执行者可以对某个用例进行操作,它们之间就具有关联关系,如下图所示,“经理”有一个功能为“查看库存报表”,因此可以在执行者“ ...

  8. VueJs - 世界地图(根据返回国家value值的大小来展示颜色的深浅分布)

    一.实现功能 1.画出世界各国的世界地图 2.根据返回name->国家全称.value->数量,渲染对比世界各国成功的国家,予以值域范围的高亮 3.滑入国家地图,出现tooltip框,提示 ...

  9. 模线性方程&&中国剩余定理及拓展

    一.求解模线性方程 由ax=b(mod n) 可知ax = ny + b 就相当于ax + ny = b 由扩展欧几里得算法可知有解条件为gcd(a, n)整除d 可以直接套用扩展欧几里得算法 最终由 ...

  10. CF578C Weakness and Poorness

    嘟嘟嘟 题面:给一个序列中的,每一个数都减去一个实数x,使得到的新序列的max(最大连续和,|最小连续和|)最小.(|ai| <= 10000) 感性的想想,会发现最大连续和随x变大而变小,最小 ...