Ansible自动化运维工具使用,详细 ! ! !

Ansible概述

Ansible是近年来愈来愈火的一款开源运维自动化工具,通过Ansible可以运维自动化,
提供运维工程师的工作效率,减少人物失误

实验环境如下

Ansible服务器 IP 192168.100.102 系统 centos7 (VM1)

客户机 1 IP192.168.100.103 系统 centos7 (VM1)

客户机 2 IP 192.168.100.104 系统centos7(VM1)

Ansible安装

进入 192.168.100.102中操作
1)通过YUM安装Ansible(联网)

#阿里云源
[root@CentOS7-02 www]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#Ansible软件默认不在yum仓库中,因此我们需要配置 epel仓库
[root@cong11 ~]# yum install -y epel-release

[root@CentOS7-02 www]#yum -y install ansible

2) 验证安装结果

[root@CentOS7-02 www]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

3)创建SSH免密交互

Ansible需要建立密钥对验证,免交互登陆

按照我图中操作

在这里插入图片描述[root@CentOS7-02 www]# ssh-copy-id root@192.168.100.103

Are you sure you want to continue connecting (yes/no)? yes

root@192.168.100.104's password: (输入100.103的root用户密码)

[root@CentOS7-02 www]# ssh-copy-id root@192.168.100.104

[root@CentOS7-02 www]# ssh 192.168.100.103
Last login: Thu Nov 14 04:05:02 2019 from 192.168.100.1
[root@centos7-03 ~]# exit (这里主机已经变了)

[root@CentOS7-02 www]# ssh 192.168.100.104
Last login: Thu Nov 14 04:05:21 2019 from 192.168.100.1
[root@centos7-04 ~]# exit

Ansible配置

还是在100.102 ansible中操作
Ansible 通过将设备列表以分组添加到/etc/ansible/hosts文件来实现,对设备的管理

[root@CentOS7-02 www]# vim /etc/ansible/hosts (添加如下红色的)
[web] #组名
192.168.100.103 #设备IP
192.168.100.104

#默认是SSH端口,如果你是其他端口可以在IP后面 192.68.100.103:21 类似这样

#可以将一个主机同时归置在不同的组中
#保存退出

配置完成后,可以针对组中指定的某一个或多个主机操作
首先在客户机1,与客户机2 中安装httpd并启动

[root@centos7-03 ~]# yum -y install httpd && systemctl start httpd

1)只对web组的192.168.100.103操作,通过 --limit

[root@CentOS7-02 www]#ansible web -m command -a "systemctl status httpd" --limit "192.168.100.103"

**httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

(我这里省略了内容,太多)

2)只对192.168.100.103操作,通过IP限定

[root@CentOS7-02 www]# ansible 192.168.100.103 -m command -a "systemctl status httpd"

192.168.100.103 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2019-11-14 05:17:48 CST; 10min ago

3)只对192.168.100.网段主机操作,通过通配符

[root@CentOS7-02 www]# ansible 192.168.100.* -m command -a "systemctl status httpd"

192.168.100.103 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

192.168.100.104 | SUCCESS | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)

Ansible命令

都是在Ansible服务器 100.102中操作

Ansible的维护命令大多以ansible开头,在终端输入ansible两次tab支持补全
[root@CentOS7-02 www]# ansible
ansible ansible-console-2 ansible-galaxy ansible-playbook-2.7

1.ansible

ansible 是生产环境中使用最频繁的的命令之一,主要用于以下场景

非固化需求
临时一次性操作
二次开发接口调用

非固化需求是指临时的维护,类如 查看磁盘使用情况,复制一个文件,
这些没有规律的

我这里只介绍常用的参数

1)检查所有主机是否存活

[root@CentOS7-02 ~]# ansible all -f 5 -m ping
192.168.100.103 | SUCCESS => { #SUCCESS表示成功
"changed": false, #changed:false表示没有对主机进行更改
"ping": "pong" #pong:ping 执行了ping
}
192.168.100.104 | SUCCESS => {
"changed": false,
"ping": "pong"
}

(all,表示/etc/ansible/hosts,我们这里只有两个组,如果有多个会ping所有,-f 5参数表示 ping 5次 ,)

2)列出web组所有主机列表

[root@CentOS7-02 ~]# ansible web --list
hosts (2):
192.168.100.103
192.168.100.104

3)批量显示web组中的磁盘使用空间

[root@CentOS7-02 ~]# ansible web -m command -a "df -hT"
(web是/etc/ansible/hosts,web组的意思)
192.168.100.104 | SUCCESS | rc=0 >>
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 1.4G 16G 8% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm

192.168.100.103 | SUCCESS | rc=0 >>
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 1.4G 16G 8% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm

Ansible 的返回结果非常友好,三种颜色表示结果: 红色,绿色,橘黄色

红色表示执行过程有异议,橘黄色表示执行后目标有状态变化

绿色表示执行成功且没有对目标机器做过修改

我上面其实是绿色,只是这个编辑器不能显示绿色

2.Ansible-doc

用来查询ansible模块文档的说明,类似man,可以针对每个模块用法说明

列出支持的模块

[root@CentOS7-02 ~]#ansible-doc -l
(q 退出)

查询ping模块的说明信息

[root@CentOS7-02 ~]# ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

A trivial test module, this module always returns pong' on successful contact. It does not make sense in

3.Ansible-playbook

Ansible-playbook是日常应用中使用频繁最高的命令,类似linux中的sh,source命令
这个命令,在后面应用脚本会详细解释

4.Ansible-console

这个工具是Ansible为用户提供的一款交互式工具,类似linux的shell,非常方便
root@CentOS7-02 ~]# ansible-console

root@all (2)[f:5]$ cd web
root@web (2)[f:5]$ list
192.168.100.103
192.168.100.104

root@web (2)[f:5]$ ping
192.168.100.103 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.100.104 | SUCCESS => {
"changed": false,
"ping": "pong"
}

(支持Tab键补全,Ctrl+C退出)

Ansible 模块

还是在 Ansible 100.102中操作
1.command模块

command模块在远程主机上执行命令,不支持管道,重定向等操作

chdir: 在远程主机上运行命令前要提前进入的目录

creates: 在命令运行时创建一个文件,如果文件已存在,不会执行

removes: 在命令运行时移除一个文件,如果文件不存在,不会执行

executeble: 指明运行命令的shell程序

运行“ls ./”命令,对所有组,运行前切换到/home目录

[root@CentOS7-02 ~]# ansible-console
root@all (2)[f:5]$ cd web
root@web (2)[f:5]$ mkdir /home/123
root@web (2)[f:5]$ exit

[root@CentOS7-02 ~]# ansible all -m command -a "chdir=/home ls ./"

192.168.100.103 | SUCCESS | rc=0 >>
123
192.168.100.104 | SUCCESS | rc=0 >>
123

2.shell模块

shell模块在远程主机执行命令,相当于调用远程主机Shell的进程,然后在该Shell下打开一个子Shell运行命令,和command区别,它支持 管道,重定向等操作,

[root@CentOS7-02 ~]# ansible web -m shell -a 'echo "hello" >> /root/hello.txt'

192.168.100.104 | SUCCESS | rc=0 >>

192.168.100.103 | SUCCESS | rc=0 >>

[root@CentOS7-02 ~]# ssh 192.168.100.103 cat /root/hello.txt
hello
[root@CentOS7-02 ~]# ssh 192.168.100.104 cat /root/hello.txt
hello

3.copy模块

copy模块用于复制指定主机到远程主机的远程位置,参数如下

dest: 指出复制文件的目标目录位置,使用绝对路径,如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖

src: 指出源文件路径,可以使用相对路径和绝对路径,支持直接指定目录,如果源是目录,测目标也要是目录

mode: 指出复制时,目标文件的权限,可选
ownter: 指出复制时,目标文件的属主,可选
group: 支持复制时,目标文件的属组,可选

content: 指出复制到目标主机上的内容,不能与src一起使用,

[root@CentOS7-02 ~]# ansible web -m copy -a "src=/etc/hosts dest=/root/ mode=777 owner=nobody group=root"

(应该是橘黄色,这里网页编辑器只有红色,橘黄色表示命令执行后目标有变化)

192.168.100.104 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/root/hosts",

192.168.100.103 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/root/hosts",

[root@CentOS7-02 ~]# ssh 192.168.100.103 ls -l /root/hosts
-rwxrwxrwx 1 nobody root 158 11月 14 14:55 /root/hosts
[root@CentOS7-02 ~]# ssh 192.168.100.104 ls -l /root/hosts
-rwxrwxrwx 1 nobody root 158 11月 14 14:55 /root/hosts
(权限777,nobody是属主,root是属组)

4.hostname模块

hostname模块用于管理远程主机上的主机名,参数如下

name : 指定主机名

[root@CentOS7-02 ~]# ansible 192.168.100.103 -m hostname -a "name=demo1"

192.168.100.103 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "demo1",
"ansible_hostname": "demo1",
"ansible_nodename": "demo1"
},
"changed": true,
"name": "demo1"
}

(还是橘黄色)

进到客户机 1 100.103中
[root@centos7-03 ~]# hostname
demo1 #这里虽然改了,重启才会生效,本例不重启

5.yum模块

yum模块基于yum机制,可以对远程主机管理程序包,参数如下

name: 程序包的名称,可以带上版本号,若不指明,则默认为最新版本

state=present | latest | absent : 指明对程序包执行的操作,present表示安装 latest 表示安装最新版本的程序包,absent表示卸载

disablerepo: 在用yum安装时,临时禁用某个仓库的ID
enablerepo: 在用yum安装时,临时启动某个仓库的ID

conf_file: yum运行时的配置文件,而不是使用默认的配置文件
diable_gpg_check=yes|no: 是否启动完整性效验功能

这里的yum只是发送一个指令,客户端本地需要配置yum,而且有可以软件包

客户机1 100.103中配置yum源,挂载光盘,客户机2 也是

ansible服务器运行如下
[root@CentOS7-02 www]# ansible web -m yum -a "name=vsftpd state=present"

[root@CentOS7-02 www]# ssh 192.168.100.103 rpm -qa vsftpd
vsftpd-3.0.2-22.el7.x86_64

这里104我就不显示验证了

6.service模块

service模块为用来远程管理主机上的服务模块,参数如下
name: 被管理的服务
state=started | stopped | restarted : 动作包含关机,关闭或重启

enabled=yes|no: 表示是否设置开机自启
runlevel: 如果设定了enabled开机自启,则要定义在哪些运行目标下自动启动

先进入客户机 1 100.103中,运行如下命令
[root@centos7-03 ~]# systemctl stop httpd

再进入客户机2 100.104中
[root@centos7-04 ~]# systemctl start httpd
[root@centos7-04 ~]# systemctl enable httpd

回到Ansible服务器中
[root@CentOS7-02 ~]# ansible web -m service -a "name=httpd state=started enabled=yes"

192.168.100.104 | SUCCESS => { #绿色显示,成功没有改变
"changed": false,
"enabled": true,
"name": "httpd",
"state": "started",

192.168.100.103 | SUCCESS => { #橘黄色显示,表示有改变
"changed": true,
"enabled": true,
"name": "httpd",
"state": "started",

7.user模块

user 模块用于管理远程主机上的用户账户,参数如下

name: 必须策略,账户名称
state=present| absent : 创建账户或者删除账户,present 表示创建,absent表示删除
system=yes|no: 是否为系统账号

uid: 用户 UID
group: 用户的基本组
groups: 用户的附加组
shell: 默认使用的shell
home: 用户的家目录

move_home=yes|no: 如果设置的家目录已经存在,是否将已存在的家目录进行移动
password: 用户的密码,建议使用加密后的字符串
comment: 用户的注释信息
remove=yes|no: 当state=absent时,是否要删除用户的家目录

[root@CentOS7-02 ~]# ansible web -m user -a 'name=user1 system=yes uid=51 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"'

192.168.100.104 | SUCCESS => {
"changed": true,
"comment": "test user",
"createhome": true,
"group": 0,

192.168.100.103 | SUCCESS => {
"changed": true,
"comment": "test user",
"createhome": true,
"group": 0,

[root@CentOS7-02 ~]# ssh 192.168.100.103 tail -1 /etc/passwd
user1:x:51:0:test user:/home/user1:/sbin/nologin
[root@CentOS7-02 ~]# ssh 192.168.100.104 tail -1 /etc/passwd
user1:x:51:0:test user:/home/user1:/sbin/nologin
(51是uid,test user是解释,/home/user1是家目录,后面的是使用的shell)

删除用户及家目录实例如下

[root@CentOS7-02 ~]# ansible web -m user -a "name=user1 remove=yes state=absent"

192.168.100.104 | SUCCESS => {
"changed": true,
"force": false,
"name": "user1",

192.168.100.103 | SUCCESS => {
"changed": true,
"force": false,
"name": "user1",

[root@CentOS7-02 ~]# ssh 192.168.100.103 tail -1 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@CentOS7-02 ~]# ssh 192.168.100.104 tail -1 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
(已经没有这个用户了)

playbook配置文件

1.基本配置

playbook配置文件使用YAML语法,playbook配置文件类似shell脚本,一个YAML格式文件

在playbook配置文件中可以放置任务代码,然后执行,可以实现自动化运维

YAML文件的扩展名通常为.yaml或.yml

YAML语法和其他语言类似,通过 “-” 来代表项,通过冒号":"来分隔键和值, 整个文件以 " - - - " 开始并以 “. . .” 结束
进入ansible服务器中 100.102中

[root@CentOS7-02 ~]# vim /etc/ansible/hosts (组的改成如下)
[web1]
192.168.100.103
[web1]
192.168.100.104

这里以一个例子演示,创建用户,和复制文件

[root@CentOS7-02 ~]# vim /etc/ansible/a.yml (按照下图中打)
(如果你想直接复制粘贴,我后面提供一个百度云txt文档,不要直接托txt到linux中,进去txt后复制粘贴)

必须和我下面的格式一模一样空格也是,不然会报错

在这里插入图片描述

链接:https://pan.baidu.com/s/17lrspNNUi7vPtzptjdhGiQ
提取码:x56p
脚本写好后,需要依靠特定的命令执行
ansible-playbook

--syntax-check: 检查yaml文件的语法
-C: 预测试,不会改变目标主机的任何设置
–list-hosts: 列出yaml文件影响的主机列表
–list-tasks: 列出,yaml文件的任务列表

[root@CentOS7-02 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml (测试a.yml语法)

playbook: /etc/ansible/a.yml #这样表示没有错误

[root@CentOS7-02 ~]# ansible-playbook -C /etc/ansible/a.yml
在这里插入图片描述
[root@CentOS7-02 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml (列出主机)

playbook: /etc/ansible/a.yml

play #1 (web1): web1 TAGS: []t
pattern: [u'web1']
hosts (2):
192.168.100.103
192.168.100.104

play #2 (web2): web2 TAGS: []
pattern: [u'web2']
hosts (0):

[root@CentOS7-02 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml

playbook: /etc/ansible/a.yml

play #1 (web1): web1 TAGS: []
tasks:
adduser TAGS: [aaa] #这里aaa就是刚刚的tag标签,可以很方便的看任务
addgroup TAGS: [bbb]

play #2 (web2): web2 TAGS: []
tasks:
copy file to web TAGS: [ccc]

[root@CentOS7-02 ~]# ansible-playbook /etc/ansible/a.yml (执行脚本,注意看下图)
在这里插入图片描述

一般都先是预测试脚本文件,然后再执行脚本文件

2. 触发器

需要触发才能执行的任务,当之前在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这是就需要定义handlers

例如当对目标主机的配置文件做修改后,如果任务执行成功,可以配置一个触发器,在触发器中,定义目标主机的服务重启,以使配置文件生效

handlers是Ansible提供的条件机制之一,handlers和task很类似,但是它只是在task通知时候才会触发执行

handlers只会在所有任务执行后执行,而且即使被通知多次,它也只会执行一次,handlers按照定义的顺序依次执行

例如,把web1 100.103主机的80端口改为8080端口

[root@CentOS7-02 ~]# ssh 192.168.100.103 netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 892/httpd

[root@CentOS7-02 ~]# vim /etc/ansible/httpd.yml (按我下图打,这个在我上面的百度云中也有分享)
在这里插入图片描述

[root@CentOS7-02 ~]# ansible-playbook --syntax-check /etc/ansible/httpd.yml

playbook: /etc/ansible/httpd.yml #没有报错

[root@CentOS7-02 ~]# ansible-playbook -C /etc/ansible/httpd.yml (预测试)

[root@CentOS7-02 ~]# ansible-playbook /etc/ansible/httpd.yml (执行)

[root@CentOS7-02 ~]# ssh 192.168.100.103 netstat -anpt | grep 8080 (已修改)
tcp6 0 0 :::8080 :::* LISTEN 2093/httpd

3.角色

有了角色后,可以直接在yaml文件中调用一个或多个角色,然后会自动运行其目录中全部代码,

将多种不同的tasks的文件集中,则该目录就是角色,角色一般存放在/etc/ansible/roles目录,

/etc/ansible/roles/目录下有很多目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构

有apache角色,nginx角色,这里mariadb为例

files: 存放由copy或scrip等模块调用的文件
templates: 存放template模块查找所需要的模块文件的目录,如mysql配置文件的模块
tasks: 任务存放的目录
handlers: 存放相关触发执行器的目录
vars: 变量存放的目录
meta: 用于存放此角色元数据
default: 默认变量存放的目录,文件中定义了此角色使用的默认变量

基本格式如下
--- hosts: web
remote_user: root
roles:
- mysql
- httpd

当定义了角色后,使用ansible-playbook执行,此时ansible会到角色结合目录中,去找mysql和httpd目录,然后依次允许mysql目录和httpd目录下的所有代码

可以只调用一个角色,也可以调用多个角色

这里以一个例子安装mariadb数据库,安装完成后上传本地配置文件,重启服务,并新建testdb数据库,并允许test用户对其有权限
1)被管理端配置yum源

客户机1 100.103配置yun源,挂载系统光盘

2)配置数据库角色
在ansible服务器100.102中操作

[root@CentOS7-02 ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
(会输出信息,-v就是输出信息的意思,创建目录结构)

[root@CentOS7-02 handlers]# cd /etc/ansible/roles/mariadb/

[root@CentOS7-02 mariadb]# ls
files handlers tasks (刚刚创建的三个目录)
[root@CentOS7-02 mariadb]# cd tasks/ (任务存放目录)

[root@CentOS7-02 tasks]# vim main.yml
(按照我下图打,这个上面的百度云中也有分享)

下面的 这个 “create database testdb” 我下图中这里的"databse"打错了,少打了一个a,把图中错误的改成我这里红色字的

在这里插入图片描述
这个文件只是部分脚本代码,不可以单独运行,所有也就不用测试

[root@CentOS7-02 tasks]# cd /etc/
[root@CentOS7-02 etc]# chmod 777 my.cnf (默认只有读取权限)

[root@CentOS7-02 etc]# cd /etc/ansible/roles/mariadb/files/
[root@CentOS7-02 files]# cp /etc/my.cnf /etc/ansible/roles/mariadb/files/
(这就是刚刚脚本文件中写的,src就是会在这个文件夹中找my.cnf,然后上传)

[root@CentOS7-02 files]# cd …/handlers/
[root@CentOS7-02 handlers]# vim main.yml
在这里插入图片描述
保存退出,这个也不可以单独运行,是一部分代码

[root@CentOS7-02 handlers]# cd /etc/ansible/
[root@CentOS7-02 ansible]# vim mariadb.yml
在这里插入图片描述

执行这个脚本文件,相当于一个总的开关,会调用mariadb角色,并执上两个文件中的那些代码

[root@CentOS7-02 ansible]# ansible-playbook --syntax-check mariadb.yml

playbook: mariadb.yml
[root@CentOS7-02 ansible]# ansible-playbook -C mariadb.yml
(测试会出现蓝色,没事,只要没有红色就行)

[root@CentOS7-02 tasks]# ansible-playbook /etc/ansible/mariadb.yml
(执行,不能出现红色,其他颜色都可以,红色是报错)

验证

进入客户机1 100.103中

[root@demo1 ~]# mysql -u root

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| testdb | #这里有testdb数据库
+--------------------+

验证权限

MariaDB [(none)]> show grants for 'test'@'192.168.100.%';
在这里插入图片描述

实验完毕 !!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值