Ansible Roles

Roles角色

roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制

运维复杂的场景:建议使用 roles,代码复用度高

官方文档:Ansible角色

Ansible Roles 目录编排

image-20230610155911393

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

image-20251116110256595

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐