Ansible学习

ansible相关介绍、功能用途和特点

批量操作服务器(几十台、几百台、甚至上千台),ansible就是批量操作服务器的工具

应用场景

批量部署服务:比如说几十台服务器都需要安装nginx服务,不可能手工一台台安装,这时候就可以使用ansible进行批量的分发文件,批量的部署这个服务。

配置文件更新:比如多台服务器的配置文件都需要更新的时候,也可以使用ansible

代码上线:比如多台服务器需要发版代码上线,也可以使用ansible

批量创建用户、批量创建目录:比如多台服务器进行用户的创建,目录的创建等等

Ansible的主要功能

  1. 批量执行远程命令,可以对N多台主机同时进行命令的执行。
  2. 批量配置软件服务,可以进行自动化的方式配置和管理服务。
  3. 实现软件开发功能,jumpserver堡垒机底层就是使用ansible来实现的自动化批量管理。
  4. 编排高级的IT任务,ansible的playbook是一门编程语言,可以用力啊描绘一套IT剧本架构,完成复杂的任务。类似shell脚本 
  5. 通过roles角色定义,可以自定义部署某一个角色任务或者某一些角色任务。

ansible的配置文件

[root@localhost ~]# rpm -qc ansible

/etc/ansible/ansible.cfg     #主配置文件

/etc/ansible/hosts               #主机清单文件

ansible的安装和基本配置

#ansile的安装

#.rpm安装(一般使用yum安装)(推荐使用)

wget -O /etc/yum.repos.d/epel.repo http:mirrors.aliyun.com/repo/epel-7.repo

yum -y install ansible

#或者

yum install epel-release  #依赖工具epel源

yum -y install ansible

#确认ansible的版本号

ansible --version

#模块调用测试

ansible localhost -m ping

#ansible的基本配置

vim /etc/ansible/hosts     #主机清单文件

#主机清单文件解析

## blue.example.com## 192.168.100.1## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
## [webservers]           
#Webserver模块组名字[xxx]
## alpha.example.org
## beta.example.org
## 192.168.1.100         
#批量的服务器IP,代表IP100和110两台服务器
## 192.168.1.110
# If you have multiple hosts following a pattern you can specify# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
##[dbservers]                 
#数据库模块组名字
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net

## 10.25.1.56                #批量的数据库,代表56和57两台服务器

## 10.25.1.57
# Here's another example of host ranges, this time there are noleading os:
## db-[99:101]-node.example.com

#修改ansible的配置文件

vim /etc/ansible/ansible.cfg

host_key_checking=False     #禁用每次执行ansible命令检查ssh key host,默认是注释,开启即可

log_path = /var/log/ansible.log        #开启日志记录,默认注释,开启即可

[accelerate]

accelerate_port= 5099                  #加速连接端口,默认注释,开启即可,也可以改变端口号,此处没改

#accelerate timeout = 30
#accelerate connect timeout = 5.0
# The daemon timeout is measured in minutes. This time is measured

# from the last activity to the accelerate daemon.

#accelerate daemon timeout = 30

# If set to yes, accelerate multi key will allow multiple

# private keys to be uploaded to it, though each user must

# have access to the system via SSH to add a new key. The default

# is "no".
accelerate multi key = yes         
#释放,默认注释

cat /etc/ansible/ansiblecfg grep "/etc/ansible/hosts"        #查看Inventory定义的被管理主机清单文件

inventory= /etc/ansible/hosts             #Inventory文件主要用来填写被管理主机列表信息,默认Inventory 文件为/etc/ansible/hosts     当然也可以自定义一个文件,当执行ansible 命令时使用-i选项指定Inventory文件位置也可

#配置管理端到被管理端的免密登录,以方便ansible进行管理

#管理端机器上生成ssh密钥对,实现能无密码链接登录到被管理机器

ssh-keygen -t rsa     #下面一路回车,不用输密码

ls /root/.ssh/             #查看私钥和公钥

yum -y install openssh openssh-cients openssh-server        #若没有ssh命令和ssh-copy-id等时候的安装

ssh-copy-id -i /root/.ssh/id rsa.pub [email protected]        #或仅IP也可(ssh [email protected] ifconfig head -3),第一次需要输入对方用户密码:123456

 配置管理端到被管理端的登录另一种方式(无需免密,将密码直接写入ansible配置文件方式),以方便ansible进行管理

#被管理机器的密码也可 (不过第一次连接时需要输入yes确认,后面就不需要了)
cat /etc/ansible/hosts  ssh         #默认22端口时候

[maya]
keeper-01 ansible_ssh_host="192.168.14.128" ansible_ssh_user="root" ansible_ssh_pass="123456"

maya-001-129 ansible_ssh_host="192.168.14.129" ansible_ssh_user="root" ansible_ssh_pass="123456"

[mem]
mem1 ansible_ssh_host="192.168.14.130" ansible_ssh_user="root" ansible_ssh_pass="123456"

mem2 ansible_ssh_host="192.168.14.131" ansible_ssh_user="root" ansible_ssh_pass="123456"
#如: ansible批量发送文件时,远端机器ssh的端口号不是22,而是已经改变了的22115时候的配置

cat /etc/ansible/hosts          #ssh端口发生改变的时候

[app-girl]
app-girl1 ansible_ssh_host="172.17.133.212" ansible_ssh_user="root" ansible_ssh_pass="b6eMWV2V00" ansible_ssh_port=21115

app-girl2 ansible_ssh_host="172.17.133.213" ansible_ssh_user="root" ansible_ssh_pass="C4NMcSyBro" ansible_ssh_port=22115

Ansible命令的常用模块使用

ad-hoc模式或命令模式简介

ansible在命令行中执行的命令,也称为ad-hoc模式,ad-hoc模式其实就是"临时命令",执行完即结束,不会保存。
用ansible命令模式批量管理主机,对复杂的操作非常不方便,需要使用playbook剧本模式。

 ansible常用ad-hoc模块命令行使用

command或shell模块,执行远程命今,管理被管理端(ad-hoc模式,其实就是临时命令,执行完即结束,不会保存)

都是批量执行命令,she更强大,什么都能于,如果需要一些管道等复杂命令的操作,则使用shell,command完成不了,shell还能执行脚本。
#执行远程命令: 以下的command也可以用shell代替
#格式:ansible 列表组名 -m command/shell -a"执行的远程命令"

tansible all -m command -a "执行的远程命令"        #管理所有模块下机器,执行远程机器命令
ansible test -m command -a "执行的远程命令"         #管理单独某个模块组名下机器,执行远程机器命令
ansible test -m command -a "ifconfig | grep ens33" -f 50       #command执行不了,-f 50一次显示50个主机
ansible test -m shell -a "ifconfig | grep ens33" -f 50         #shell可以执行,-f 50一次显示50个主机

#执行远程shell脚本

格式:ansible 列表组名 -m shell -a "执行的远程脚本"

ansible test -m shell -a "sh /root/1.sh"

copy模块,批量发送文件到被管理端或向被管理端文件写内容

例如:将管理端 (ansible机器) 上本地文件(/tmp/a.txt)批量发送给被管理端(tmp/目录)

copy模块注意: 所有被管理端需要安装: libselinux-pythor ,此处为192.168.171.129和192.168.171.130上

#批量安装

例如:ansible 列表组名 -m shell -a "yum install -y 软件名称"

ansible test -m shell -a "yum install libselinux-python -y"               #默认cent7.x已经安装,若没有安装,需要先安装该包

#使用copy模块

格式:ansible 列表组名 -m copy -a "src=/tmp/a.txt dest=/tmp/"

ansible test -m copy -a "src=/tmp/a.txt dest=/tmp/"           #src代表原文件路径,dest代表目的路径

service模块,启动,停止,重启,重载服务等

格式: # ansible test -m service -a "name=服务名 state=stopped enabled=yes

例子:ansible test -m service -a "name=httpd state=stopped enabled=yes"

使用详解:
name: 定义要启动服务的名称,参数即为各服务名

state: 指定服务状态是停止或运行,或重载等,

参数如下:
started:启动
stopped:停止
restarted:重启

reloaded:重载
enabled: 开机自启动

script模块,编写脚本和执行脚本(本地编写脚本,本地运行,即可等同于在远程执行)

在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行。

格式: ansible test -m script -a ".../本地编写的脚本.sh"

例子:

管理端:
cat /root/yum wget.sh

yum -y install wget
chmod +x /root/yum wget.sh

ansible test -m script -a "/root/yum wget.sh"

所有被管理端:
wget -V          #查看版本 V是version简写

file模块,配置模块,远程创建目录,远程创建文件,远程做软硬链接文件

#远程创建目录:

ansible test -m file -a "path=/tmp/shi state=directory"

#远程创建文件:

ansible test -m file -a "path=/tmp/shi.txt state=touch mode=555 owner=root group=root"

#远程做软连接:
ansible test -m file -a "src=/tmp/shi.txt path=/tmp/shi.txt_link state=link"
#递归创建或更改目录权限:
ansible test -m file -a "path=/tmp/shi state=directory owner=root group=root mode=600 recurse=yes"

使用详解:

path:              指定远程主机目录或文件目录

recurse:         递归授权

state:             表示对"列表组"的操作状态

参数如下:

directory:         在远端创建mull
touch:              在远端创建文件
link:                  link或hard表示创建链接文件
absent:             表示删除文件或目录
mode:               设置文件或目录权限
owner:              设置文件或目录属主信息

group:               设置文件或目录属组信息
 

group模块,远程创建组
格式: ansible test -m group -a "name=要创建的组名 gid=888 state=present” 
#列子:

如:ansible test -m group -a "name=shi_group gid=888 state=present"   #创建组shi_group,指定gid为888

使用详解:

name:      指定创建的组名
gid:          指定组的gid
state:       表示对组的操作状态,

参数如下:
absent:     删除远端的组
present:    创建远端的组(默认)

#查看倒数两个用户组

tail -2 /etc/group

user模块,远程创建用户
创建用户:不加密码:
ansible test -m user -a "name=shi uid=88 group=shi_group shell=/sbin/nologin create_home=no state=present"

删除用户:
ansible test -m user -a "name=shi uid=88 group=shi_group shell=/sbin/nologin create_home=no state=absent"

创建普通用户并设置登录密码:

echo 'mima' openssl passwd -1 -stdin       #给指定的密码内容加密,注意需要加密,用户才能登录

$1$PxrOduFH$OsqImb.R6gy80gm8qlUvc0

ansible test -m user -a 'name=shi3 password="$1$PxrOduFH$OsaImb.R6ay80am8alUvc0"'
使用详解:

name:                    指定创建的用户名
uid:                        指定用户的
gruop:                    指定用户组名称
gruops:                  指定附加组名称
password:              给用户添加密码
shell:                      指定用户登录shell
create home:         是否创建家目录
state:                      表示对用户的操作状态,参数如下:
absent:                   删除远端的组

present:               创建远端的组(默认)
#查看创建的用户

id shi3

cron模块,远程添加定时任务 (下面:a.sh是远程机器上本地有的脚本)

远程添加定时任务,未设置注释信息:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* job='bin/sh /root/a.sh' state=present"
远程添加定时任务,并设置注释信息,防止定时任务重复:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='注释信息' job='bin/sh /root/a.sh' state=present"
远程注释定时任务:
ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='cron1' job='bin/sh /root/a.sh' state=present disabled=yes"
远程删除定时任务:
# ansible test -m cron -a "minute=00 hour=01 day=* month=* weekday=* name='cron1' job='bin/sh /root/a.sh' state=absent"

#查看远程定时任务

crontab -l

mount模块,远程添加挂载
立刻挂载并写入/etc/fstab中:
ansible test -m mount -a "src=192.168.171.128:/data path=/opt fstype=nfs opts=defaults,noatime state=mounted"

立刻卸载并清除/etc/fstab中信息:

ansible test -m mount -a "src=192.168.171.128:/data path=/opt fstype=nfs opts=defaults,noatime state=absent"

使用详情:

src:                   要被挂载的原目录
path:                 要挂载到的本地目录
fstype:               要挂载的文件类型
state:                 挂载或卸载的状态

参数如下:
present:          开机挂载,不会直接挂载设备,仅将配置写入/etc/fstab,不会马上挂载
mounted:           马上直接挂载设备,并将配置写入/etc/fstab
unmounted:       马上直接卸载设备,不会清除/etc/fstab写入的配置

absent:              马上直接卸载设备,会清理/etc/fstab写入的配置
例子:

管理端: 192.168.171.128
yum -y install nfs-utils         #被管理的挂载端也要安装,才能挂载

vim /etc/exports                  #配置一个共享目录允许任何人可以挂载输入:/data *(rw,no_root squash)
systemctl start nfs
ansible test -m mount -a "src=192.168.171128:/data path=/opt fstype=nfs opts=defaults,noatime state=mounted"
#查看被管理端挂载的服务
mount | grep opt

get_url模块,下载模块
下载模块: get_url
get_url:
url:                 下载地址
dest:               下载到本地的路径;
mode:             权限;
checksum:      对资源做校验;
      sha256:
      md5:

例子:
管理端: 192.168.171.128

ansible test -m get_url -a 'url=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm dest=/tmp mode=0666'

#被管理端查看下载的文件

ls /tmp/

systemd模块,通过systemd来管理服务启停,类似systemctl start httpd

解释:
name                              服务名称
state                               服务状态
started                            启动
stopped                          停止
restarted                         重启
reloaded                         重载
enabled                           开启自启动 |  yes 启   no 不
daemon reload: yes        重载systemd整个的配置文件

例子:用systemd模块启动服务并加入开机自启

管理端:192.168.171.128

ansible test -m systemd -a 'name=nginx state=started enabled=yes'

#查看刚安装的服务状态

ansible test -m command -a 'systemctl status nginx'

你可能感兴趣的:(ansible,学习,服务器)