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.%'
;