1.什么是Ansible
Ansible 是 python 中的一套模块,系统中的一套自动化工具,只需要使用 ssh 协议连接及可用来系统管理、自动化执行命令等任务。
2.为什么需要Ansible?
批量管理功能:
1. 可以实现批量系统操作配置
2. 可以实现批量软件服务部署
3. 可以实现批量文件数据分发
4. 可以实现批量系统信息收集
管理服务意义:
1. 提高工作的效率(部署综合架构)
2. 提高工作准确度
3. 减少维护的成本
4. 减少重复性工作
安装部署简单:
1. 没有配置文件(不需要配置)
2. 不需要启动服务
3. 客户端没有需要部署任务
同类型软件对比
1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用C/S结构的模式,salt-master和salt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列
3.如何学习Ansible?
1.官方文档
2.帮助文档
3.其他人写好的文档
4.Ansible的功能及优点
1.远程执行
批量执行远程命令,可以对多台主机进行远程操作
2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。
5.二次开发
因为语法是Python,所以便于运维进行二次开发。
6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务
在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd
在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx
第二章 Ansible安装部署
Ansible的安装部署十分简单,只需要yum安装就行
#1.安装epel源
[root@m01 ~]# wget -O etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@m01 ~]# yum install ansible -y第三章 Ansible主机清单
/etc/ansible/hosts 主机资产清单文件,用于定义被管理主机的认证信息, 例如 ssh 登录用户名、密码以及 key相关信息。
1.主机支持主机名通配以及正则表达式,例如 web[1:3].oldboy.com 代表三台主机
2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666
3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]
支持组对组
1.指定主机组相关配置
#主机组
[root@m01 ~]# cat /etc/ansible/hosts
[webserver]
172.16.1.31
172.16.1.41
#主机+端口+密码
[webserver]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#对整个主机组都生效的变量
[webserver:vars]
ansible_ssh_pass='123456'
#针对所有webserver组都生效的变量
[webserver:vars]
ansible_ssh_pass='123456'
#两个组配置children
[cc:children]
web
nfs
#针对所有组的变量
[all:vars]
ansible_password='123456'
配置文件详解
[root@m01 ~]# cat etc/ansible/ansible.cfg
#inventory = etc/ansible/hosts #主机列表配置文件
#library = usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = var/log/ansible.log #ansible日志
#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False 打开
命令介绍
# ansible <host-pattern> [options]
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
第四章 Ansible常用模块
Ansible ad-hoc
| 什么是ad-hoc? |
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
| ad-hoc模式的使用场景 |
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
| Ansible-doc帮助手册 |
[root@m01 ~]# ansible-doc -l # 查看所有模块说明
[root@m01 ~]# ansible-doc copy # 查看指定模块方法
[root@m01 ~]# ansible-doc -s copy # 查看指定模块参数
-j 以json格式显示所有模块信息
-l 列出所有的模块
-s 查看模块常用参数
0.如何学习模块
ansible官方网站:
https://docs.ansible.com/模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
1.ping模块
应用场景:
测试主机和ansible之间的连通性
举例:
对webserver主机组测试是否连通
ansible webserver -m ping2.command 简单模块
应用场景:
类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少
01.查看主机名,可以执行成功
[root@m01 ~]# ansible webserver -m ping
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
02.使用awk拼接查看主机IP执行失败
[root@m01 ~]# ansible webserver -m command -a "ifconfig eth0|grep 10"
172.16.1.31 | FAILED | rc=255 >>
SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
172.16.1.41 | FAILED | rc=255 >>
SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
3.shell 万能模块
万能模块,所有命令都可以执行,和本地执行效果一样
01.使用管道查询IP地址
[root@m01 ~]# ansible webserver -m shell -a "ifconfig eth0|grep 10.0.1"
172.16.1.41 | CHANGED | rc=0 >>
inet 10.0.1.41 netmask 255.255.255.0 broadcast 10.0.1.255
172.16.1.31 | CHANGED | rc=0 >>
inet 10.0.1.31 netmask 255.255.255.0 broadcast 10.0.1.255
02.批量执行脚本
在其他主机上创建一个脚本,内容为打印主机名
cat > echo.sh << EOF
#!/bin/bash
echo "$(hostname)"
EOF
然后使用ansible的shell模块批量执行
[root@m01 ~]# ansible webserver -m shell -a "/bin/bash root/echo.sh"
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.31 | CHANGED | rc=0 >>
nfs01
4.copy 拷贝文件
01.拷贝m01的hostsname文件到其他主机的/opt目录下
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/opt"02.在传输文件时修改文件属主和属组信息
ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ owner=oldboy group=oldboy"03.在传输文件时修改文件的权限信息
ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ mode=0600"04.创建文件并直接写入内容
ansible 172.16.1.31 -m copy -a "content='1' dest=/etc/rsync.password mode=0600"05.复制目录
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
ansible 172.16.1.31 -m copy -a "src=/data dest=/data"src后面目录有/: 只将目录下面的内容都进行远程传输复制
ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"06.在目标主机本地执行copy操作
ansible all -m copy -a "src=/etc/hostname dest=/opt remote_src=yes参数说明:
src #推送数据的源文件信息
dest #推送数据的目标路径
backup #对推送传输过去的文件,进行备份
content #直接在远程主机被管理文件中添加内容,会覆盖原文件内容
group #将本地文件推送到远端,指定文件属组信息
owner #将本地文件推送到远端,指定文件属主信息
mode #将本地文件推送到远端,指定文件权限信息
remote_src: 在目标主机本地执行copy操作
template:变量
5.file 设置文件属性
01.创建文件夹
ansible web -m file -a "path=/root/oldboy state=directory"02.创建文件并更改属性
ansible oldboy -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"03.创建软链接
ansible oldboy -m file -a "src=/root/.ssh/ path=/xiaoming_link state=link"04.删除文件
ansible web -m -a "path=/opt/xiaoming.txt state=absent"05.创建文件的同时-可以指定属主权限
ansible -m file -a "path=/tmp/xiaoming state=touch owner=www group=www mode=600"06.递归更改目录授权
ansible all -m file -a "path=/opt/data owner=zhangya group=zhangya recurse=yes参数说明:
path #指定远程主机目录或文件信息
recurse #递归授权
state # 状态
directory #在远端创建目录
touch #在远端创建文件
link #link 或 hard 表示创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息
hard #创建硬连接,需要和src配合使用
recurse: #递归修改 yes no
6.script模块
vvvvv 显示详细过程 执行 蓝色 [root@m01 ~]# ansible wb-m script -a "/server/scripts/yum.sh"# 编写脚本
[root@m01 ~]# mkdir -p server/scripts
[root@m01 ~]# cat server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@m01 ~]# ansible wb-m script -a "/server/scripts/yum.sh"
7.cron定时任务模块
创建测试脚本:
[root@m01 ] # cat echo_hostname.sh
#!/bin/bash
echo "$(date +%F)_$(hostname)" >> tmp/hostname.txt
01.创建一条定时任务
ansible web -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh/server/scripts/test.sh'"02.注释定时任务信息,防止重复
ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash opt/echo_hostname.sh" disabled=yes02-1.打开一条注释信息
ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash opt/echo_hostname.sh" disabled=no' ansible oldboy -m cron -a "name='cron01' job='/bin/sh server/scripts/test.sh'"03.删除相应定时任务(只要写名字)
ansible all -m cron -a 'name="None" state=absent'#删除Nodeansible oldboy -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh
/server/scripts/test.sh' state=absent"
04.注释相应定时任务,使定时任务失效
ansible oldboy -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh/server/scripts/test.sh' disabled=no"参数
job #指定需要执行的任务
minute #分钟
hour #小时
day #天
month #月
weekday #周
name #对计划任务进行描述
state:
absetn #删除计划任务
disabled=yes #注释
8.user用户模块
01.创建用户指定uid,gid,不创建家目录也不允许登陆
ansible web -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no"02.创建普通用户,允许登录设置密码为123456
官网文档
如何为用户模块生成加密密码?
Ansible ad-hoc命令是最简单的选项:
ansible all -i localhost, -m debug -a "msg={{ '密码' | password_hash('sha512', '密码') }}"
大多数Linux系统上可用的mkpasswd实用程序也是一个不错的选择:
mkpasswd --method=sha-512
如果您的系统上未安装此实用程序(例如,您正在使用macOS),那么您仍然可以使用Python轻松生成这些密码。首先,确保 已安装Passlib密码哈希库:
pip install passlib
库准备就绪后,可以按以下方式生成SHA512密码值:
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#howdo-i-generate-encrypted-passwords-for-the-user-module对密码进行加密
注意变量
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', '123456') }}" localhost | SUCCESS => { "msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcn LhrOX3jQc6L/NKAohhQJn/" }剧本方式执行
[root@m01 ~] # cat useradd.yaml
- hosts: web01
tasks:
- name: useraddpass
user:
name: xiaoming2
password: '$6$123$g5ateLQLXjS9urJNqpW3i.vmDCXpIP7H0NWfrh6CJSTJUZwmULaTKR7iyZG8ZLIBHmkJAc91gHmCwdkFwovkQ/'
参数说明:
name #指定用户的名字
home #指定用户的家目录
uid #指定用户的uid
group #指定用户的用户组
groups #指定用户的附加组
password #指定用户的密码
shell #指定用户的登录shell
create_home #是否创建用户家目录,默认是yes no
remove #删除用户时,指定是否删除家目录
state:
absent #删除用户
9.group组模块
01.创建用户组
ansible oldboy -m group -a "name=oldzhang gid=888 state=present"参数说明:
name #指定创建的组名
gid #指定组的 gid
state
absent #移除远端主机的组
present #创建远端主机的组(默认)
10.yum模块
ansible web -m yum -a "name=httpd state=installed"1-列出所有已安装的软件包
[root@ansible ~]# ansible web -m yum -a 'list=installed'2-列出所有可更新的软件包
[root@ansible ~]# ansible 1 web -m yum -a 'list=updates'####3-列出所有的yum仓库
[root@ansible ~]# ansible web -m yum -a 'list=repos'####4-只下载软件包并到指定目录下
[root@ansible ~]# ansible web -m yum -a 'name=httpd download_only=yes download_dir=/tmp'####5-安装软件包
[root@ansible ~]# ansible web -m yum -a 'name=httpd state=installed'####6-卸载软件包
[root@ansible ~]# ansible web -m yum -a 'name=httpd state=removed'7-重指定URL地址安装rpm 包
yum install nginx -y
sed -i '38,87d' /etc/nginx/nginx.conf
cat >/etc/nginx/conf.d/yum.conf <<EOF
server {
listen 80;
server_name localhost;
location / {
root /data/yum;
charset utf-8,gbk;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
}
EOF
mkdir /data/yum chown -R nginx:nginx /data/yum
cd /data/yum
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.01.el7.ngx.x86_64.rpm
nginx -t systemctl restart nginx
curl 127.0.0.
从管理机安装软件
ansible all -m yum -a "name=http://10.0.0.61/nginx-1.10.01.el7.ngx.x86_64.rpm state=latest"参数说明:
name #指定要安装的软件包名称
download_dir #指定下载软件包的存放路径,需要配合download_only一起使用
download_only #只下载软件包,而不进行安装,和yum --downloadonly一样
list:
installed #列出所有已安装的软件包
updates #列出所有可以更新的软件包
repos #列出所有的yum仓库
state:
installed, present #安装软件包(两者任选其一都可以u哦那个第二个)
removed, absent #卸载软件包
latest #安装最新软件包
11.service.systemd服务管理
ansible oldboy -m service -a "name=nfs state=stopped enabled=yes"
[root@m01 ~] # ansible backup -m service -a "name=rsyncd state=restarted enabled=yes"
ansible backup -m service -a "name=rsyncd state=started enabled=yes"
参数说明:
name # 定义要启动服务的名称
state # 指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务
enabled #开机自启
12.mount远程nfs本地也装nfs
本地机器必须支持这个命令;安装nfs
1-挂载一个目录并写入fastab
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted"
2--只写入fastab 但是不挂载
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present"3-写入fastab但是不挂载
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present4-卸载已经挂载的目录并删除fstab条目
ansible web -m mount -a "path=/data state=absent5-卸载已经挂载的目录但是不删除fstab条目
ansible web -m mount -a "path=/data state=unmounted状态解释
src # 需要挂载的
path #本地挂载目录
state
present # 开机挂载,仅将挂载配置写入/etc/fstab
mounted # 挂载设备,并将配置写入/etc/fstab
unmounted # 卸载设备,不会清除/etc/fstab 写入的配置
absent # 卸载设备,会清理/etc/fstab 写入的配置-如果挂载目录空的会删除目录
fstype=nfs
remounte #强制重新挂载
13.unarchive解压
01.解压远程服务器的压缩包到指定目录
ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"02.把本地文件解压到目标机器指定目录
ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/" 14.archive压缩
01.压缩单个文件
ansible 172.16.1.31 -m archive -a "path=/var/log/message ,,,,,dest=/tmp/log.tar.gz format=gz force_archive=true" 02压缩文件到指定目录
ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.tar.gz03 压缩文件到指定目录格式
ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.zip format=zip" ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archive=true" 15.setup 获取主机信息
01.直接执行获取主机信息
ansible 172.16.1.31 -m setup02.只将主机某个信息打印出来
[root@m01 /server/scripts/test]# ansible 172.16.1.41 -m setup -a "filter=ansible_all_ipv4_addresses"
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.16.1.41",
"10.0.1.41"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
16.get_url下载模块
下载 文件weget
[root@ansible ~] # ansible web -m get_url -a 'url=http://47.114.186.72/xiazai/video_2020-02-15_19-03-52.mp4 dest=/tmp mode=0644' -i hosts
参数
url #指定下载地址
dest #指定下载的目录
mode #指定权限
checksum #校验加密算法
md5
sha256 注意http
17.Ansible防火墙模块
#修改配置文件关闭selinux,必须重启
[root@m01 ~]# ansible web_group -m selinux -a 'state=disabled' -i ./hosts
#临时关闭
[root@m01 ~]# ansible web_group -m shell -a 'setenforce 0' -i ./hosts
[root@m01 ~]# ansible web_group -m shell -a 'getenforce' -i ./hosts
##16.查看帮助
ansible-doc -l
ansible-doc copy
第六章 Ansible输出信息颜色解释
01. 绿色信息: 查看主机信息/对主机未做改动
02. 黄色信息: 对主机数据信息做了修改
03. 红色信息: 命令执行出错了
04. 粉色信息: 忠告信息
05. 蓝色信息: 显示ansible命令执行的过程




