Ansible角色、性能优化、安全优化
摘要: Ansible Roles提供了一种结构化的方式来组织变量、文件、任务等元素,通过目录分类(如tasks、handlers、vars等)实现高效代码复用。优化方面:1)性能优化包括关闭gather_facts、调整并发数、设置facts缓存(支持json和redis);2)安全优化涉及value加密、配置sudo用户替代root远程登录、结合VPN和跳板机使用。通过ansible-gala
文章目录
Ansible Roles
Roles角色
roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制
运维复杂的场景:建议使用 roles,代码复用度高
官方文档:Ansible角色
Ansible Roles 目录编排

Roles各目录作用
-
files目录 :存放由copy或script模块等调用的文件
-
templates目录:template模块查找所需要模板文件的目录
-
tasks目录:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
-
handlers目录:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含
-
vars目录:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含
-
meta目录:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
-
default目录:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
ansible-galaxy创建角色
#在当前目录下创建一个名为myrole的目录,其默认包含了标准的角色目录结构
ansible-galaxy init myrole
[root@localhost ~]# tree myrole/
ansible.yaml
myrole/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
playbook调用角色
#如果ansible.yaml 中要调用 role
#playbook如下
---
- hosts: test1
remote_user: root
roles:
- myrole
Ansible优化
性能优化
(1)关闭gather_facts功能
ansible-playbook执行过程中,第1个步骤总是执行gather facts,不管你有没有在playbook设置tasks
如果不需要远程主机数据的话,就可以关闭获取fact数据功能。关闭之后,可以加快ansible-playbook执行效率,尤其管理大量机器的时候
#方法1:
#在playbook中关闭gather_facts功能
- hosts: test
gather_facts: False
tasks
- name
xxxxx
xxxxx
#方法2:
#永久关闭,需要的时候再打开,在ansible.cfg配置文件中添加
#还能指定主机清单文件
[defaults]
gathering = explicit
inventory = /etc/ansible/hosts
#如果后续需要只用在playbook中添加即可
gather_facts: true
(2)修改并发数
修改并发,默认是5,要根据核心数提升
#方法1:
#运行playbook -f参数指定并发数,例如
ansible-playbook test.yaml -f 10
#方法2:
#永久修改并发数为10
[defaults]
forks = 10
(3)设置facts变量缓存
如果要开启gather_facts又想性能快一点,就可以使用facts变量缓存
使用json文件缓存
#1.在ansible.cfg配置文件中添加
[defaults]
gathering = explicit
fact_caching_timeout = 86400
fact_caching = jsonfile
fact_caching_connection = /dev/shm/ansible_fact_cache
使用redis缓存
使用redis缓存需要安装redis,还需要安装控制端的python库
#1.安装redis
yum install redis
#2.安装 Python3 版本的pip工具
yum install python3-pip
#3.将已安装的pip升级到最新版本
python3 -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip
#4.配置 pip 源(永久加速)
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
#5.安装redis的python库
pip3 install redis
#6.修改ansible.cfg配置文件
gathering = explicit
facts_caching_timeout = 86400 #设置缓存过期时间86400秒
facts_caching = redis # 使用redis或者 (或者使用memcached,即"facts_caching = memcached")
fact_caching_connection = 127.0.0.1:6379:0
#若redis设置了密码,比如密码为"admin",则配置修改如下:
# fact_caching_connection = localhost:6379:0:admin
安全优化
(1)vaule加密
#1.加密/etc/ansible/hosts文件
ansible-vault encrypt /etc/ansible/hosts
##此时打开此文件是非人类可读状态
#2.解密/etc/ansible/hosts文件
ansible-vault decrypt /etc/ansible/hosts
(2)系统配置修改ssh端口,普通用户sudo,关闭root远程登陆功能
- 配置sudo用户ansible ALL=(ALL) NOPASSWD: ALL密码是1,ssh端口是22
- 配合VPN,jumpserver一起使用,用户->vpn->jumpserver->ansible
配置sudo
#管理端:
#1.添加ansible用户的sudo权限
ansible all -m shell -a "echo 'ansible ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
#2.添加ansible用户
ansible all -m shell -a "useradd ansible"
#3.设置ansible用户的密码
ansible all -m shell -a "echo 'Abc@1234csq' | passwd --stdin ansible"
#4.设置管理端ansible配置文件ansible.cfg
[defaults]
sudo_user = ansible #被管理端上具有sudo权限的用户 NOPASSWD: ALL
remote_user = ansible #被管理端使用的用户,不指定默认是当前用户
remote_user = 22 #被管理端ssh端口号
[privilege_escalation]
become=True #开启sudo功能
become_method=sudo #使用sudo命令
become_user=root #普通用户切换为root
#5.改完之后重新分发密钥给ansible普通用户(可以使用脚本分发)
ssh-copy-id ansible@ip #所有节点都要分发
#6.关闭root远程登陆功能
ansible all -m shell -a "sed -i 's/PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config"
ansible all -m shell -a "systemctl restart sshd"
脚本如下
#脚本如下
#!/bin/bash
##############################################################
# File Name:private_pulic.sh
# Version:V1.0
# Author:csq
# Organization: www.chenshiquan.xyz
# Desc:
##############################################################
########################### 变量 #############################
#存放IP的文件
ip_file=/opt/ip.txt
#这里填远程主机的密码
pass=Abc@1234csq
#需要免密连接的用户
user=ansible
########################### 颜色库 #############################
function color_all(){
echoread (){
str=$*
echo -e "\E[1;31m${str}\E[0m"
}
echoyellow (){
str=$*
echo -e "\E[1;33m${str}\E[0m"
}
echogreen (){
str=$*
echo -e "\E[1;32m${str}\E[0m"
}
echobule (){
str=$*
echo -e "\E[1;34m${str}\E[0m"
}
}
########################### 错误输出和定位到空 #############################
echo_null(){
"$@" >/dev/null 2>&1
}
echo_error(){
echoread "Error: $1"
exit 1
}
########################### 判断IP文件是否存在 #############################
check_ip_file(){
echobule "正在检查IP文件是否存在..."
if [ ! -f ${ip_file} ];then
echo_error "${ip_file}不存在,请创建后在执行${0}脚本"
else
echogreen "${ip_file}存在"
ips=`cat /opt/ip.txt`
fi
}
########################### 创建密钥 #############################
create_key() {
echobule "正在检查本机密钥是否创建..."
key_file="$HOME/.ssh/id_rsa"
if [ ! -f ${key_file} ];then
echogreen "密钥不存在正在创建"
if echo_null ssh-keygen -t rsa -f ${key_file} -P '';then
echogreen "密钥创建成功,在${HOME}/.ssh/下"
else
echo_error "密钥创建失败,请检查..."
fi
else
echoyellow "密钥已存在"
fi
}
########################### 检查命令是否存在 #############################
check_cmd(){
local os=/etc/os-release
if [ ! -f /${os} ];then
echoread "${os}文件不存在"
else
source ${os}
echogreen "初始化变量${os}完成..."
fi
case $ID in
kylin|rocky|centos )
if ! echo_null which sshpass;then
if echo_null yum install -y sshpass;then
echogreen "安装成功sshpass"
else
echo_error "安装失败sshpass"
fi
fi
;;
ubuntu )
if ! echo_null which sshpass;then
if echo_null apt install -y sshpass;then
echogreen "安装成功sshpass"
else
echo_error "安装失败sshpass"
fi
fi
;;
* )
echo_error "未识别的系统"
;;
esac
}
########################### 分发密钥 #############################
fenfa_key(){
for ip in $ips
do
if echo_null sshpass -p ${pass} ssh-copy-id -o StrictHostKeyChecking=no ${user}@${ip};then
echogreen "分发密钥成功$ip"
else
echo_error "分发密钥失败${ip},请检查密码"
fi
done
}
########################### 检查密钥 #############################
fenfa_check(){
echobule "检查密钥中..."
for ip in $ips
do
if ! ssh -o StrictHostKeyChecking=no ${user}@${ip} hostname -I;then
echo_error "检查密钥失败..."
fi
done
echogreen "检查成功!,可以使用ssh连接主机了"
}
########################### main #############################
main() {
color_all
check_ip_file
create_key
check_cmd
fenfa_key
fenfa_check
}
main
网站集群自动化与Ansible

更多推荐



所有评论(0)