自动化运维之ansible的ad-hoc,ansiblead-hoc


【假装正经的前言】
  想要做一名优秀的运维师,首先要时刻铭记的就是效率!效率!效率!同样的一份工作,你拼死拼活做了一小时,人家做了10分钟,而且完美,你说你气不气,你说老板给不给人家加鸡腿。至于你,还是顶着老板的白眼多学习吧。所以,这篇博文就来介绍一个自动化运维工具,让你嗑着瓜子喝着茶分分钟搞定工作!

【严肃的说】
先来介绍一些自动化运维常用工具:

场景 工具 用途
安装系统 pxe/cobbler 安装系统
虚拟化系统 kvm/xen/vmware 虚拟机
应用部署 puppet/ansible/saltstack 中大型规模
命令执行 ansible/fabric/ffunc/shell 中小型

  ansible聚集以上部署和命令执行于一身,能够完整轻易的实现应用部署和批量命令功能,适用于主机数量中型规模,再大的使用puppet。

【自动化运维之ansible】
  ansible是新出现的自动运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置,批量程序部署、批量运行命令等功能。
  ansible是基于paramiko开发的,并且基于模块化工作,本身没有批量部署的能力。真正具备批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。目前已经被红帽官方收购。

【ansible特点】
 1、部署简单,只需在主控制端部署ansible环境,被控制端无需做任何操作;
 2、默认使用ssh协议对设备进行管理
 3、有大量常规运维操作模板,可实现日常绝大部分操作。
 4、配置简单、功能强大、扩展性强
 5、支持API及自定义模块,可通过Python轻松扩展
 6、通过playbooks来定制强大的配置、状态管理;
 7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可。
 8、提供一个功能强大、操作性强的web管理界面REST API接口—AWX平台

[ansible任务执行模式]
ad-hoc和playbook
ad-hoc:
ad-hoc模式使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。相当于bash中的一句shell。
playbook:
playbook模式是ansible主要管理方式,也是ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

本篇就先来介绍ad-hoc模式。

[ansible命令执行过程]
1、加载自己的配置文件,默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组。
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
5、对应执行用户家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0 退出。

【ansible安装方式】
ansible安装常用两种方式,yum安装和pip程序安装
1、使用yum安装
yum install epel-release -y
yum install ansible –y
2、使用pip(python的包管理模块)安装
pip install ansible
如果没pip,需先安装pip.yum可直接安装:
yum install python-pip
pip install ansible

安装后来看一下ansible的配置文件:


[root@centos7 ansible]# vim /etc/ansible/ansible.cfg
[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

#这里只截取了小段,并不是全部的文档

 既然ansible要管理节点,那么就需要定义被管理节点的地址,此项要在/etc/ansible/hosts文件中定义:

可以直接知名主机地址或者定义一个主机组两种方法都可以。
[root@centos7 ansible]# vim /etc/ansible/hosts
[web]           #定义主机组
192.168.64.129  #被管理节点
192.168.64.130  #被管理节点

ansible还有一些常用命令,例如
/usr/bin/ansible和/usr/bin/ansible-doc
/usr/bin/ansible是临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc是ansible模块功能查看工具。前面已经说过,ansible本身没有部署能力,真正的大佬是它所运行的模块。

下面就正式介绍ansible的常用模块,同时加上ansible任务执行的一种模式:ad-hoc。

1、ping 主机连通测试

[root@centos7 ansible]# ansible web -m ping         #web是之前定义的主机组,也可以直接指定主机地址,前提是已经在文件中定义好              
192.168.64.130 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.64.129 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

2、command:在远程主机执行命令;不支持管道命令(|)
ansible的默认模块,不必指定模块参数也可。

[root@centos7 ansible]# ansible web -m command -a "date" 
192.168.64.130 | SUCCESS | rc=0 >>
Tue Dec  5 23:19:37 CST 2017

192.168.64.129 | SUCCESS | rc=0 >>
Tue Dec  5 23:19:48 CST 2017

命令模块接受命令名称,后面是空格分隔的列表参数。
给定的命令将在所有选定的节点上执行。它不会通过shell进行处理。
例如HOMEHOME和操作如” 小于 “<”, “>”, “|”, ” ; “, “&” “工作(需要使用(shell)模块实现这些功能)。
action:
  chdir #在执行命令之前,先切换到该目录
  creates #一个文件名,当文件名存在,则该命令不执行,可以用来做判断
  executable #切换shell来执行命令,需要使用命令的绝对路径
  free_form #要执行的Linux指令,一般使用ansible的-a 参数代替
  removes #一个文件名,这个文件不存在,则该命令不执行,于creates相反的判断。

[root@centos7 ansible]# ansible web -m command -a "ls -l  chdir=/tmp creates=test"
192.168.64.130 | SUCCESS | rc=0 >>
skipped, since test exists

192.168.64.129 | SUCCESS | rc=0 >>
skipped, since test exists

3、shell模块
  在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。在执行命令的时候使用的是/bin/sh。


[root@centos7 ansible]# ansible web -m shell -a 'cat /etc/passwd|grep "root"'
192.168.64.130 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

192.168.64.129 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4、copy:复制文件到远程主机,可以改权限等。
 (1)复制文件
  # ansible web -m copy -a “src= dest= ”
 (2)给定内容生成文件
  # ansible web -m copy -a “content= dest= ”
一些选项:
  backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
eg: # ansible web -m copy -a “content=cidchewudhwiedwetest dest=/app/test backup=yes”
在远程主机上,会将源文件备份,并在文件名后面加上随机数和时间作为标注。

 content:用于替代”src”,可以直接设定指定文件的值
 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录。
 force:如果目标主机包含该文件,但内容不同。如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时才进行复制。默认为yes。
 others:所有的file模块里的选项都可以在这里使用
 src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径,如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/” 来结尾,则只复制目录里的内容,如果没有使用”/” 来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

server:
[root@centos7 app]# ansible web -m copy -a "src=test dest=/app"
[root@centos7 app]# ansible web -m copy -a "content=cidchewudhwiedwetest dest=/app/test backup=yes"


node1:
[root@node1 app]# ll
total 656
-rw-r--r-- 1 root root     20 Dec  5 20:39 test
-rw-r--r-- 1 root root     13 Dec  5 20:36 test.4939.2017-12-05@20:40:02~
    在远程主机上,会将源文件备份,并在文件名后面加上随机数和时间作为标注

5、file 设置文件属性
 创建目录: -a “path= state=directory ”
 创建链接文件: -a “path= src= state=link”
 删除文件:-a “path= state=absent”

一些属性:
force:
  需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,有两种选项:yes|no
group:
  定义文件/目录的属性 mode:定义文件/目录的权限
owner:
  定义文件/目录的属主 path:必选项,定义文件/目录的路径
recurse:
  递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
  state:
  directory:如果目录不存在,就创建目录
  file:即使文件不存在,也不会被创建
  link:创建软链接
  hard:创建硬链接
  touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
  absent:删除目录、文件或者取消链接文件。

server:
[root@centos7 app]# ansible web -m file -a "path=/app/test3 state=directory"
[root@centos7 app]# ansible web -m file -a "path=/app/test3 src=/app/d1 state=link"

node:
[root@node1 app]# ll
total 656
drwxr-xr-x 2 root root      6 Dec  5 20:47 d1
lrwxrwxrwx 1 root root      7 Dec  5 20:48 test3 -> /app/d1
-rw-r--r-- 1 root root     13 Dec  5 20:36 test.4939.2017-12-05@20:40:02~

6、fetch 从远程某主机获取文件到本地
  dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile ;那么在主机中,保存为/backup/master/etc/profile
  src:在远程拉取的文件,并且必须是一个file,不能是目录。

[root@centos7 app]# ansible web -m fetch -a "src=/app/fstab dest=/app" 
 [root@centos7 app]# tree
.
├── 192.168.64.129
│   └── app
│       └── fstab
├── 192.168.64.130
│   └── app
│       └── fstab
└── test

7、cron 管理crontab计划任务
action:cron backup= #如果设置,则创建一个crontab备份[yes|no]
  cron_file= #如果指定,使用这个文件cron.d,而不是单个用户
  day= #日应该运行的工作( 1-31, , /2, )
  hour= #小时 ( 0-23, , /2, )
  minute= #分钟( 0-59, , /2, )
  month= #月( 1-12, *, /2, )
  weekday= #周 ( 0-6 for Sunday-Saturday,, )
  job= #指明运行的命令是什么
  name= #定时任务描述
  reboot #任务在重启时运行,不建议使用,建议使用special_time
  special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
  state #指定状态,present表示添加定时任务,也是默认设置, absent表示删除定时任务
  user #以哪个用户的身份执行

server:
[root@centos7 ansible]# ansible web -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate 172.17.0.1 &> /dev/null" ' 

node:
[root@node1 app]# crontab -l
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate 172.17.0.1 &> /dev/null

8、yum 安装软件
conf_file
  #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check
  #是否禁止 gpg checking ,只用于’ present ’ or ’ latest ’
disablerepo
  #临时禁止使用yum库。只用于安装或更新时
enablerepo
  #临时使用的yum库。只用于安装或更新时
name=
  #所安装包的名称
state=
  # present 安装,latest 安装最新版本 ,absent 卸载软件
update_cache
  #强制更新yum的缓存

server:
[root@centos7 ansible]# ansible web -m yum -a "name=tree state=latest"

node:
[root@node1 app]# which tree
/usr/bin/tree

9、service 服务程序管理

arguments #命令行提供额外的参数
enabled  #设置开机启动
name=  #服务名称
runlevel  #开机启动的级别,一般不用指定
sleep   #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动
state   # started启动服务, stopped停止服务,restarted重启,reloaded重载配置文件

10、user 用户模块,管理用户账号

comment  #用户的描述信息
createhome  #是否创建家目录
force    #在使用state=absent时,行为与userdel-force一致
group   #指定基本组
groups   #指定附加组,如果指定为(groups=)表示删除所有组
home   #指定用户家目录
move_home  #如果设置为home=时,试图将用户主目录移动到指定的目录
name   #指定用户名
non_unique   #该选项允许改变非唯一的用户ID值
password   #指定用户密码
remove  #在使用state=absent时,行为是与userdel-remove 一致
shell    #指定默认shell
state   #设置账号状态,不指定为创建,指定值为absent表示删除
system   #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。
uid    #指定用户的uid
update_password #always' will update passwords if they differ.
on_create’ will only
set the password for
newly created users.

server:
[root@centos7 ansible]#  ansible web -m user -a 'name=tom comment="tom is tom" uid=1066  group=tom groups=wheel'

node:
[root@node1 app]# getent passwd tom
tom:x:1066:1000:tom is tom:/home/tom:/bin/bash

11、group 用户组模块,添加或删除组

gid   #设置组的GID号
name= #管理组的名称
state  #指定组状态,默认为创建,设置值为absent为删除
system  #设置值为yes,表示创建系统组

12、script 在指定节点运行服务端的脚本


将服务器端上的脚本放在节点机器上运行
[root@centos7 app]# vim wan.sh
    #!/bin/bash
    date > /app/date.log
[root@centos7 app]# ansible web -m script -a "./wan.sh"


node:
[root@node1 app]# ll
total 8
-rw-r--r-- 1 root root 29 Dec  6 01:49 date.log

13、setup 模块

facts组件是ansible用于采集被管理及其设备信息的一个功能,我们可以使用setup模块查看机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量。每个主机的各种信息,CPU颗数,内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如reahat系列用yum安装,而debian系列用apt来安装软件。

setup模块主要用于收集一些硬件信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数就是filter参数。

ansible的基本模块以及任务模式之一的ad-hoc的常见方法基本就是这些了,它的另一种任务模式playbook就找下次再说吧~~~

相关内容

    暂无相关文章