1.ansible概述
1.1 Ansible基本概述
Ansible是一个IT自动化的配置管理工具(python开发,基于ssh远程服务批量管理主机),自动化主要体现在Ansible集成了丰富模块,丰富的功能组件,可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作和维护成本,以提高工作的效率。
1.2 Ansible的功能
1)批量执行远程命令,可以对N多台主机同时进行命令的执行
2)批量配置软件服务,可以进行自动化的方式配置和管理服务。
3)实现软件开发功能,jumpserver底层使用ansble来实现的自动化管理
4)编排高级的IT任务,Ansible的playbook是一门编程语言,可以用来描绘一套IT架构。
1.3 Ansible的特点
1.容易学习,无代理模式,不像saltstack既要学服务端又要学习客户端,还要学习服务端与客户端之间的通讯协议
2.操作灵活,体现在Ansible有较多的模块,提供了丰富的功能,playbook则提供了类似于编程语言的复杂功能
3.简单易用,体现在Ansible —个命令可以完成很多事情
4.安全可靠,因为Ansible使用了SSH协议进行通汛,既稳定又安全
5.可移植性高,可以将写好的playbook拷贝至任意机器进行执行
1.4 Ansible原理
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块ansible只提供一种框架。
ansible这个框架主要包含以下功能:
(1)连接插件connection plugins:负责和被监控端事先通信;
(2)host inventory:操作主机清单;
(3)核心引擎:ansible
(4)借助与插件完成记录日志邮件等功能;
(5)Playbook:剧本执行多个任务时,非必须可以让节点一次性运行多个任务。
1.5 Ansible任务执行模式
1.ad-hoc:这个模式支持执行单个模块,支持批量执行单条命令。
2.playbook:可以把多个你想要执行的任务放到一个playbook当中,通过这多个任务可以完成一个总体的目标
saltstack 并行 (CS结构)
ansible 串行
2 ansible环境准备
2.1 安装ansible服务
yum -y install ansible
软件包需要配置epeel源
依赖关系:因为是python开发所以需要python环境,这里的python版本使用2版本
2.2 ansible配置目录结构
[root@ansible ~]# rpm -qc ansible
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主机清单
./ansible.cfg | ./hosts(ini格式) |
---|---|
[defaults] inventory = ./hosts | [webservers] web1 ansible_ssh_host=172.16.1.7 web2 ansible_ssh_host=172.16.1.8 |
2.3 ansible服务端与客户端之间 进行免密操作
① 生成密钥对
ssh-keygen 【 -C(指定邮箱) 476764695@qq.com】
② 推送服务器公钥到需要进行免密连接的客户端
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.x
③ 测试免密连接
ssh root@172.16.1.x
#检验对端公钥信息
ansible webservers -m ping
执行ansible ad-hoc 测试 是否能与该清单定义的节点通讯
④脚本方式推送公钥
cat /server/scripts/distribute_pub_key.sh
#!/bin/bash
for ip in 5 6 7 8 9 31 41 51 52 61 62 71
do
sshpass -p123456 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null
if [ $? -eq 0 ]
then
echo "host 172.16.1.$ip distribute_pub_key ok."
else
echo "host 172.16.1.$ip distribute_pub_key failed."
fi
done
----------------------
#!/bin/bash
#检查脚本
vim /server/scripts/check_pub_key.sh
#!/bin/bash
for ip in 7 31 41
do
ssh root@172.16.1.$ip hostname
done
2.4 ansible启动服务
ansible安装即可使用,不用执行启动服务命令
2.5 ansible 配置文件优先级
$ANSIBLE_CONFIG—>> 查看当前环境变量 然后指向这个环境所在的ansible.cfg
优先一 ./ansible.cfg
优先二 ~/.ansible.cfg
优先三 /etc/ansible/ansible.cfg (最后匹配)
-i 目标主机列表可以指定任意位置的hosts,建议使用目录下的创建配置
2.6 ansible组件之inventory主机清单
两种书写方式
第一种:基于密码方式#多个主机都需要密码方式连接
情况一: 密码 端口 用户 不统一---手敲
[webservers]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456' #尽量不使用明文
情况二: 密码 端口 用户 都是统一
[webservers]
web01 ansible_host=172.16.1.7
web02 ansible_host=172.16.1.8
情况三:定义变量
[webservers]
172.16.1.7
172.16.1.8
[web:vars] #固定格式: 配置了一些内置变量参数
ansible_port=52113 #可以指定远程服务端口信息
ansible_password=123456 #可以指定连接主机地址
ansible_user=root #可以指定以什么用户身份远程管理 了解
ansible_password: #可以指定密码信息
第二种:基于秘钥的方式(默认)
[webservers]
172.16.1.31
[webservers]
172.16.1.31 hostname=nfs
172.16.1.7 hostname=web01
172.16.1.8 hostname=web02
[webservers] (较多:生产环境中IP地址难记,配置hosts解析有时闲麻烦)
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
第三种其他类写法 #采用匹配方式进行配置
[webservers]
www[01:50].example.com
[web]
172.16.1.[10:20]
[databases]
db-[a:f].example.com
2.7 ansible命令使用
#ansible命令使用说明
/usr/bin/ansible #命令行加载模块功能 命令执行实现批量管理
-i INVENTORY --- 加载指定hosts.资产清单文件
-m MODULE_NAME --- 加载指定模块信息
-a MODULE_ARGS --- 加载指定模块参数信息
/usr/bin/ansible-playbook #剧本中加载模块功能 脚本执行实现批量管理
-e EXTRA_VARS --- 用于指定剧本变量信息
-C, --check --- 模拟执行剧本功能
--syntax-check --- 测试剧本语法规范
--skip-tags SKIP_TAGS --- 跳过指定标记功能
-t TAGS --- 关注指定标记信息
/usr/bin/ansible-doc #ansible程序帮助命令 #/EX 可以看详细示例
-l --- 列表显示ansible所有模块信息3380多个模块
-s --- 显示模块详细参数信息 #可以看示例
3.ansible ad-hoc方式书写模块
Ad-Hoc playbook基础
临时命令,执行完即结束,并不会保存。 场景:
比如查看多个机器的某个进程是否启动,将某个文件拷贝到多个机器中。
ansible webserbers -m 模块 -a ‘动作’
[root@manager ansible_adhoc]# ansible webservers -m command -a ‘df -h’
提示:
绿色:正常
黄色:被控端发生了更改
红色:报错
常用模块
命令 | command(不支持管道) shell(常用于单条ansible命令) |
---|---|
测试 | ping |
安装 | yum |
配置 | copy |
启动 | systemd |
挂载 | mount |
定时 | cron |
用户 | user |
Selinux | selinux |
3.1 测试 ping模块
[root@mananger ~]# ansible webservers -m ping -i /etc/ansible/hosts
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
3.2 command与shell模块
command与shell的区别就是 command不支持使用管道,shell支持。
我们在学习模块的时候可以查看官网文档输入命令 ansible-doc+模块名称
3.3 yum模块(安装服务)
yum模块:
name 要安装软件的包名称
state:
latest 安装最新版本的软件包
absent 移除软件包
present 安装软件包
exclude 排除某些软件包( 更新大量的软件包,而某些软件不需要更新的时候)
enablerepo 指定使用某个仓库获取软件
disablerepo 不从哪个仓库获取软件
示例一、安装当前最新的Apache软件,如果存在则不安装
ansible webservers -m yum -a "name=httpd state=present"
示例二、安装当前最新的Apache软件,通过epel仓库安装
ansible webservers -m yum -a "name=httpd state=present enablerepo=epel"
示例三、通过公网URL安装rpm软件
ansible webservers -m yum -a "name=https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.0-1.el7.x86_64.rpm state=present"
示例四、安装最新版本的Apache软件,如果存在则更新Apache
ansible webservers -m yum -a "name=httpd state=latest"
示例五、更新所有的软件包,但排除和kernel相关的
ansible webservers -m yum -a "name=* state=latest exclude=kernel"
示例六、删除Apache软件
ansible webservers -m yum -a "name=httpd state=absent"
3.4 copy模块(配置服务)
copy: 管理配置模块:
src: # 控制端所在的文件路径
dest: # 拷贝到被控端的哪个目录下
owner: # 属主
group: # 属组
mode: # 权限
backup # 备份
content # 填充一个内容
emote_src: yes将远程主机进行copy
[root@manager ansible_adhoc]# ansible webservers -m copy -a "src=./exports.j2 dest=/etc/exports owner=root group=root mode=644"
[root@manager ansible_adhoc]# ansible webservers -m copy -a "src=./exports.j2 dest=/etc/exports owner=root group=root mode=644 backup=yes"
[root@manager ansible_adhoc]# ansible webservers -m copy -a "content="http-test" dest=/tmp/1.txt"
nfs的配置 文件:
[root@manager ansible_adhoc]# vim ./exports.j2
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@manager ansible_adhoc]# ansible webservers -m copy -a "src=./exports.j2 dest=/etc/exports owner=www group=www mode=644 backup=yes"
示例一、创建test用户、uid为555
[root@manager ansible_adhoc]# ansible webservers -m user -a "name=test uid=555"
示例二、移除test用户,同时移除家目录
[root@manager ansible_adhoc]# ansible webservers -m user -a "name=test uid=555 state=absent remove=yes"
示例三、创建jsm用户,为其添加123作为登录密码,并且创建家目录
ansible localhost -m debug -a "msg={{ '123' | password_hash('sha512', 'salt') }}"
ansible webservers -m user -a 'name=jsm password="$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1" create_home=yes'
3.5 file模块( 创建文件或、目录、授权 )
path: # 在被控端创建的文件具体路径
owner # 属主
group # 属组
mode # 权限
state:
link
touch # 文件
directory # 目录
recurse # 递归
3.6 group模块
group
name 组名称
gid 组的Gid
system 是否为系统组
state
present 创建(默认)
absent 删除
nfs配置中创建www组
示例一:
[root@manager ansible_adhoc]# ansible webservers -m group -a "name=www gid=666 state=present"
3.7 user模块
user
name 用户名称
comment 用户的描述 -c
uid 用户的uid -u
group 用户的主组 -g
groups 用户的附加组 -G a append: yes
state
absent remove 删除用户,并且删除家目录
present
shell 登录的方式 /bin/bash /sbin/nologin
create_home true(默认) | fasle
system false
添加用户,并设定密码
[root@mananger ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'salt') }}"
localhost | SUCCESS => {
"msg": "$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w.igcOo1R7vBYR65JquIQ/7siC7VRpmteKvZmfSkNc69."
}
[root@mananger ~]# ansible webservers -m user -a 'name=ali uid=7890 password="$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w.igcOo1R7vBYR65JquIQ/7siC7VRpmteKvZmfSkNc69." shell=/bin/bash'
创建jms用户,创建公钥与私钥
[root@mananger ~]# ansible webservers -m user -a 'name=jms generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
# 重新建立www用户
[root@mananger ~]# ansible webservers -m group -a 'name=www gid=666'
[root@mananger ~]# ansible webservers -m user -a 'name=www group=666 uid=666 shell=/sbin/nologin'
3.8 systemd 启动服务:
name : 启动的服务名称
state : 状态
started # 启动
stopped # 停止
restarted # 重启
reloaded # 重载
enabled # 开机自启 yes | 关闭开机自启 no
3.9 mount模块
src: # 我要挂载的设备 | nfs服务端
path # 挂载到本地哪个目录下
fstype # 挂载设备的类型
opts # 挂载时使用的参数
state
mounted # 立即挂载,并且添加开机自动挂载配置
absent # 临时卸载,取消开机自动挂载
--------------------------------------------------------------------
present # 仅实现开机自动挂载,不立即挂载
unmounted # 临时卸载,不取消开机自启动
3.10selinux模块
[root@mananger ~]# ansible all -m selinux -a 'state=disabled' -i /etc/ansible/hosts
3.11 firewalld模块
rich_rule: rule family=ipv4 forward-port port=443 protocol=tcp to-port=8443
zone # 区域
service # 服务
port # 端口
permanent # 永久生效
state #
enabled
disabled
masquerade # 转发
immediate # 立即生效
放行8080端口:
[root@mananger ~]# ansible webservers -m systemd -a 'name=firewalld state=started'
[root@mananger ~]# ansible webservers -m systemd -a 'name=nginx state=started'
[root@mananger ~]# ansible webservers -m firewalld -a 'port=80/tcp state=enabled immediate=yes' # 添加
[root@mananger ~]# ansible webservers -m firewalld -a 'port=80/tcp state=disabled immediate=yes' # 移除
开启转发功能
[root@mananger ~]# ansible webservers -m firewalld -a 'masquerade=yes state=enabled immediate=yes permanent=yes'
3.12 cron模块
cron
name # 定时任务的描述
minute # 分
hour # 时
day # 日
month # 月
weekday # 周
job # 任务
state # 添加和删除
user # 任务由某个具体的用户执行 [ 默认 root]
*/5 * * * * /bin/bash /server/script/check_web.sh &>/dev/null
[root@mananger ~]# ansible webservers -m cron -a "name=backups minute=*/5 hour=* day=* month=* weekday=* job='/bin/bash /server/script/check_web.sh &>/dev/null' state=present"
[root@mananger ~]# ansible webservers -m cron -a "name=backups minute=*/5 hour=* day=* month=* weekday=* job='/bin/bash /server/script/check_web.sh &>/dev/null' state=absent"
3.ansible ad-hoc 综合练习部署httpd网站
0.停止Nginx systemd
1.安装http服务 yum
2.编写简单网页测试内容 copy content
3.启动服务不加入开机自启 systemd
4.放行对应的端口 systemd | firewalld
[root@mananger ~]# ansible webservers -m systemd -a 'name=nginx state=stopped'
[root@mananger ~]# ansible webservers -m yum -a 'name=httpd state=present'
[root@mananger ~]# ansible webservers -m copy -a 'content="ansible web site" dest=/var/www/html/index.html'
[root@mananger ~]# ansible webservers -m systemd -a 'name=httpd state=started'
[root@mananger ~]# ansible webservers -m systemd -a 'name=firewalld state=started'
[root@mananger ~]# ansible webservers -m firewalld -a 'port=80/tcp state=enabled immediate=yes'