一、自动化任务执行的意义
1.1 什么是自动化执行任务?
假设我们要在10台Linux服务器上安装一个Nginx服务, 手动是如何操作的?
第一步: ssh登录Linux(1,2,3...10)服务器
第二步: 输入对应服务器密码
第三步: 执行命令yum install nginx
第四步: 执行命令systemctl start nginx
第五步: 退出登录
循环执行前面的操作,直到10台服务器的Nginx服务部署完成。
解决方案:登录哪些服务器;执行哪些命令;自动化程序
1.2 自动化执行的意义
提升运维工作效率, 减少一份工作成本
提高准确度, 手工部署易出错
1.3 自动化任务执行的应用
应用一: 批量命令执行
应用二: 定时任务
应用三: 批量程序应用服务安装
应用四: 批量配置文件同步
应用五: 批量代码部署
二、 Ansible安装与基础
2.1 什么是Ansible?
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。Ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
2.2 Ansible的特点
Ansible是Python语言实现的一套完整的自动化任务执行模块。
Ansible的play book模式, 采用yaml配置,对于自动化任务执行一目了然
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
默认使用SSH协议对设备进行管理
Ansible自动化场景支持丰富(大量常规运维操作模块),实现日常绝大部分操作
配置简单、功能强大、扩展性强
支持API及自定义模块,可通过Python轻松扩展
通过Playbooks来定制强大的配置、状态管理
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
2.3 Ansible的安装
方法一: 通过系统的方式: yum和apt-get等
方法二: 通过python的方式安装
-
#通过Python安装
-
pip3
install ansible -i https://pypi.douban.com/simple
-
-
#安装完成后检验版本
-
ansible
--version
2.4 Ansible的配置文件
需要创建的配置文件有:
-
mkdir
/etc/ansible
-
cd
/etc/ansible
-
touch
ansible.cfg
-
touch
hosts
2.4.1 Ansible配置文件位置的设置
ansible与我们其他的服务在这一点上有很大不同,Ansible的配置文件查找是从多个地方找的。
-
export ANSIBLE_CONFIG=
/etc/ansible/ansible.cfg
-
env
2.4.2 Ansible配置文件
ansible 的配置文件为/etc/ansible/ansible.cfg ,ansible 有许多参数,下面我们列出一些常见的参数:
-
# 资源清单inventory文件的位置
-
inventory = /etc/ansible/hosts
-
# 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
-
library = /usr/share/ansible
-
# 并发连接数,默认为5
-
forks = 5
-
# 设置默认执行命令的用户
-
sudo_user = root
-
# ssh连接的管理端口,默认为22端口,建议修改,更加安全
-
remote_port = 22
-
# 设置是否检查SSH主机的密钥,值为True/False。
-
host_key_checking = False
-
# 设置SSH连接的超时时间,单位为秒
-
timeout = 60
-
# 存储ansible日志的文件(默认不记录日志)
-
log_path = /var/
log/ansible.log
2.4.3 Ansible主机清单详解
(1)简单的配置:在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表
-
vim
/etc/ansible/hosts
写入下面内容
-
[
test]
ansible要操作的对象
-
172.25
.254
.20
:22
ansible_ssh_user=root
ansible_ssh_pass='123'
指定IP地址
用户
用户密码
-
192.168
.0
.20
:22
ansible_ssh_user=root
ansible_ssh_pass='123'
-
-
注意上述的内容可以根据自己的需求来写。
(2)想要远程ssh连接,有三种方式:
方式一:
-
# vim /etc/ansible/hosts
-
# ssh用户名+ssh用户密码
-
[
test]
-
172.25
.254
.20
ansible_ssh_user=root
ansible_ssh_pass='主机密码'
方式二:密钥实现远程ssh连接
1). 生成并配置ssh公钥和私钥, 如何免密登录, 快速操作如下:
-
# 生成公钥和私钥, 存储位置~/.ssh/目录下
-
$ ssh-keygen
-
# 将生成的公钥拷贝到需要远程登录的服务器上
-
$ ssh-copy-id -i ~
/.ssh/id_rsa.pub root@需要登录的远程主机
-
# 测试能否远程无密码登录
-
ssh root@需要登录的远程主机
2). 编辑Ansible的配置文件
-
# vim /etc/ansible/hosts
-
# ssh用户名+ssh密钥
-
[
test]
-
172.25
.254
.20
ansible_ssh_user=root
ansible_ssh_private_key_file=密钥文件的
-
路径
3). 执行测试
$ ansible all -a 'date'
方式三:别名实现远程ssh连接
-
# vim /etc/ansible/hosts
-
# 别名+ssh用户名+ssh密钥
-
[test]
-
test1
ansible_ssh_host=47.92.255.98 ansible_ssh_port=22
-
ansible_ssh_user=
root ansible_ssh_private_key_file=密钥文件的路径
三、Ansible ad-hoc模式
3.1 什么是ad-hoc模式?
Ad-Hoc简而言之是“临时命令”.Ansible提供两种完成任务方式:Ad-Hoc模式,即命令集,适合解决一些简单或者平时工作中临时遇到的任务。PlayBook模式, 即Ansible-playbook剧本,适合解决复杂或需固化下来的任务。
3.2 ad-hoc模式使用场景
场景一: 在多台电脑上,查看某个进程是否启动。
场景二: 在多台机器上, 拷贝指定日志文件到本地。
场景三: 检查proxy主机组的所有主机是否存活。
场景四: 在多台机器上, 查看proxy主机组所有主机的磁盘容量。等等
3-3 ad-hoc模式的命令使用
-
ansible
[options]
-
#host-pattern:用于匹配主机名或者主机组名
-
#option: 包含执行的模块和执行的命令参数,
3-4 ad-hoc模式的常用模块
(1)主机连通性测试
-
[root@client Desktop]
# ansible test -m ping
-
192.168.0.20 | SUCCESS => {
-
"ansible_facts": {
-
"discovered_interpreter_python":
"/usr/libexec/platform-python"
-
},
-
"changed":
false,
-
"ping":
"pong"
-
}
-
172.25.254.20 | SUCCESS => {
-
"ansible_facts": {
-
"discovered_interpreter_python":
"/usr/libexec/platform-python"
-
},
-
"changed":
false,
-
"ping":
"pong"
-
}
(2)command 模块
这个模块可以直接在远程主机上执行命令,并将结果返回本主机。 命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令
。
-
[root@client Desktop]
# ansible test -m command -a 'ss -ntl'
-
192.168.0.20 | CHANGED | rc=0 >>
-
State Recv-Q Send-Q Local Address:Port Peer Address:Port
-
LISTEN 0 10 192.168.122.1:53 0.0.0.0:*
-
LISTEN 0 10 192.168.0.20:53 0.0.0.0:*
-
LISTEN 0 10 172.25.254.20:53 0.0.0.0:*
-
LISTEN 0 10 127.0.0.1:53 0.0.0.0:*
-
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
-
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
-
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
-
LISTEN 0 128 127.0.0.1:953 0.0.0.0:*
-
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
-
LISTEN 0 10 [::1]:53 [::]:*
-
LISTEN 0 128 [::]:22 [::]:*
-
LISTEN 0 5 [::1]:631 [::]:*
-
LISTEN 0 100 [::1]:25 [::]:*
-
LISTEN 0 128 [::1]:953 [::]:*
-
LISTEN 0 80 *:3306 *:*
-
LISTEN 0 128 [::]:111 [::]:*
-
LISTEN 0 128 *:80 *:*
-
172.25.254.20 | CHANGED | rc=0 >>
3)shell 模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
-
[root@client Desktop]
# ansible test -m shell -a 'cat /etc/passwd | grep "root"'
-
172.25.254.20 | CHANGED | rc=0 >>
-
root:x:0:0:root:/root:/bin/bash
-
operator:x:11:0:operator:/root:/sbin/nologin
-
192.168.0.20 | CHANGED | rc=0 >>
-
root:x:0:0:root:/root:/bin/bash
-
operator:x:11:0:operator:/root:/sbin/nologin
(4)copy 模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
① 复制文件:
-
[root@client Desktop]
# ansible test -m copy -a 'src=/etc/passwd dest=/mnt'
-
172.25.254.20 | CHANGED => {
-
"ansible_facts": {
-
"discovered_interpreter_python":
"/usr/libexec/platform-python"
-
},
-
"changed":
true,
-
"checksum":
"33929b98cf1d165467b5b62be3b7ac813d5b65d2",
-
"dest":
"/mnt/passwd",
-
"gid": 0,
-
"group":
"root",
-
"md5sum":
"6fc5949596db5741544ae8b47759eacd",
-
"mode":
"0644",
-
"owner":
"root",
-
"secontext":
"unconfined_u:object_r:mnt_t:s0",
-
"size": 2807,
-
"src":
"/root/.ansible/tmp/ansible-tmp-1596274212.7856452-9940-123839584318193/source",
-
"state":
"file",
-
"uid": 0
-
}
② 给定内容生成文件,并制定权限
-
[root@client Desktop]
# ansible test -m copy -a 'content="hello world" dest=/mnt/file22 mode=666'
-
172.25.254.20 | CHANGED => {
-
"ansible_facts": {
-
"discovered_interpreter_python":
"/usr/libexec/platform-python"
-
},
-
"changed":
true,
-
"checksum":
"2aae6c35c94fcfb415dbe95f408b9ce91ee846ed",
-
"dest":
"/mnt/file22",
-
"gid": 0,
-
"group":
"root",
-
"md5sum":
"5eb63bbbe01eeed093cb22bb8f5acdc3",
-
"mode":
"0666",
-
"owner":
"root",
-
"secontext":
"system_u:object_r:mnt_t:s0",
-
"size": 11,
-
"src":
"/root/.ansible/tmp/ansible-tmp-1596274341.1756465-10845-58400519655201/source",
-
"state":
"file",
-
"uid": 0
-
}
5)yum 模块
顾名思义,该模块主要用于软件的安装。
[root@server ~]# ansible test -m yum -a 'name=httpd state=present'
(6)service 模块
该模块用于服务程序的管理
① 开启服务并设置自启动
[root@server ~]# ansible web -m service -a 'name=nginx state=started enabled=true'
② 关闭服务
[root@server ~]# ansible web -m service -a 'name=nginx state=stopped'
(6)需求
需求1: 主机连通性测试(ping模块)
需求2: 查看主机root用户的详细信息(shell模块)
需求3: 备份主机的日志文件/var/log/messages到/mnt/目录(copy模块)
需求4: 给定文件内容"hello ansible"生成文件/mnt/ansible,并指定权限为666(copy模块)
需求5: 主机批量安装软件gcc和nginx(yum模块)
需求6: 启动nginx服务(service模块)和判断nginx的80端口是否打开(shell模块-ss -ntl)
需求7: 主机新建uid=8888的用户user1
需求8: 拉取Github项目项目到主机并部署(git模块)
需求9:搜集主机信息并筛选与内存Memory相关的信息(setup模块)