ansible-基础-01

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
Selinuxselinux

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值