Ansible(五)include|roles|vault|galaxy

include,文件包含
应用场景:
一个情况就是,如果ansible剧本内容过多,涉及到多个play(- host:web),可读性变弱,不方便调试;
于是人们想出把单个大的剧本拆分为多个,小的剧本;
多个小的剧本可以通过include功能合并使用。

另一种情况就是在我们书写剧本的时候,会涉及到多个步骤,还会涉及到服务端和客户端;
发现剧本越来越大,不容易进行分析与阅读;
把剧本拆分开,分成2个文件服务端,客户端;
这时候可以通过include_tasks的功能把多个剧本文件合并在一起,让剧本变成多个方便阅读与维护;

实例01:将原来nfs部署的脚本,里边有服务端有客户端操作,分折:
首先重写server端操作脚本:nfs-server.yml

#server
    - name: 01 安装服务
    ......
#注,这里边的内容,就是从-name开始,原文件tasks:以下的内容

再重写client端操作脚本:nfs-client.yml

#client
    - name: 01 客户端第一步
    ......
#内容参照服务端

最后,写一个总文件:nfs.yml

#服务端引用
- hosts: nfs
  tasks:
    - include_tasks: nfs-server.yml
#客户端引用
- hosts: web
  tasks:
    - include_tasks: nfs-client.yml
# handlers,如果有handlers,写在这里


Roles
通过使用include_tasks功能,大型剧本,缩小体积,变的更加模块化;
我们发现新的问题,handlers,变量文件,发送配置文件(可能是j2文件)存放比较混乱(所有文件都放在一起,一个目录);
于是人们发明了一套规范,这个规范是一套剧本目录结构的要求与标准,让我们书写剧本的时候,把剧本的内容和需要的文件,按照目录要求,分门别类存储:
这套规则一般叫roles规则,roles的本质就是规定了1套目录结构,用于书写剧本的;
roles官网:https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

案例:用roles方式部署nfs-server
先看下目录结构:

nfs / #这个是总目录,可以是nfs,也可以是其他名字,自己起名
  hosts #这个是主机文件
  top.yml #这个是总入口剧本、主剧本
  group_vars/#这个是变量目录
    all/#这个是变量目录的一级子目录
  nfs-server /#这个是server部署目录
    files /#这是要传的文件
    handlers /#handlers文件
    tasks /#tasks文件
    templates /#j2文件

以上是示例文件目录结构,下面写文件

cat nfs-server/tasks/mail.yml
- name: 01. 部署nfs-utils
  yum:
    name: nfs-utils,rpcbind
    state: installed
  tags:
    - 01-install-nfs
- name: 02. 修改配置文件
  copy:
    src: exports
    dest: /etc/exports
    backup: yes
  tags:
    - 02-conf
  notify:
    - restart nfs server
- name: 03. 共享目录
  file:
    path: /backup-nfs/
    owner: nfsnobody
    group: nfsnobody
    state: directory
  tags:
    - 03-mkdir
- name: 04. 启动服务 rpc nfs
  systemd:
    name: "{{ item }}"
    enabled: yes
    state: started
  loop:
    - rpcbind
    - nfs
  tags:
    - 04-start-service
- name: 05 分发motd
  template:
    src: motd.j2
    dest: /etc/motd
    backup: yes
  tags:
    - 05-motd
-------------------------------
cat nfs-server/files/exports
/backup-nfs/  172.16.1.0/24(rw,all_squash)
---------------------------------
cat nfs-server/tmplates/motd.j2
#######################################
welcome to shostname elastic linux system
操作需谨慎,删根弹指间.
主机名: {{ ansible_hostname }}
ip地址: {{ ansible_default_ipv4.address }}
内存大小: {{ ansible_memtotal_mb }}
CPU数量: {{ ansible_processor_vcpus }}
核心总数: {{ ansible_processor_cores }}
发行版本: {{ ansible_distribution }}
-----------------------------
cat nfs-server/handlers/main.yml
- name: restart nfs server
systemd:
  name: nfs
  state: reloaded
------------------------
cat
top.yml
- hosts: backup
roles:
  - role: nfs-server
---------------------------------------------------------
cat group_vars/all/main.yml
nfs_share_dir: /backup-nfs-v3/
nfs_user: nfsnobody
nfs_user_id: 65534
---------------------------------------------------------
注意运行时候指定hosts文件和当前要与top.yml在同一个目录.
运行测试:ansible-playbook -i hosts top.yml

小结
roles本质是:目录规范;
模块化思想;
尽量多使用变量,循环,handlers。


Vault,加密指定的文件: ansible-vault用于加密敏感信息
hosts文件 加密
变量文件 加密
进行加密用法:

ansible-vault encrypt 文件#enable

进行使用

ansible或ansible-playbook --ask-vault-pass 即可

ansible --ask-vault-pass -i hosts web -m ping

彻底解密

ansible-vault decrypt hosts


Galaxy
别人的roles,别人第三方写好的roles集合,放网上,自己下载使用,下载个nginx试试

ansible-galaxy collection install nginxinc.nginx_core

优化,可以关于性能、安全方面进行优化调整
关于性能:
ssh连接速度优化,关闭UseDNS,GSSAPIAuthcation ....
不要让ansible运行交互式的命令,非要用使用命令的非交互模式.
需要使用ans,yum安装软件,可以自建本地yum仓库,然后ans安装.(自建yum源,自己制作的rpm包)
调整ansible并发数量( -f 调整并发数量 默认是5 ansible.cfg forks=5 ,实际调整根据负载情况.)
给ansible配置缓存(redis),队列.缓存facts。
给主机进行分组操作与管理.
关闭gather_facts,如果不用facts变量可以关闭, 剧本中: gather_facts: false 配置文件: gathering = explicit
关闭host,key,check 一般使用密码认证的时候需要关闭,如果不关闭 ansible配置文件 host_key_checking = False

关于安全:
配置sudo用户 ans ALL=(ALL) NOPASSWD: ALL 密码是1,ssh端口是 22
配合,jms一起使用
用户-->---->jms(跳板机)---->ansible
用户的密码,进行加密( hash, ansible-vault)

配置sudo

管理端:

egrep -v '^$|#' /etc/ansible/ansible.cfg
[defaults]
sudo_user = ans #被管理端上具有sudo权限的用户
nopasswd: ALL
remote_user = ans #被管理端使用的用户,不指定默认是当前用户/root
remote_port  = 22 # 被管理端ssh端口号
host_key_checking = False
log_path = /var/log/ansible.log
[inventory]
[privilege_escalation]
become=True # 开启sudo功能
become_method=sudo #使用sudo命令
become_user=root #普通用户切换为root
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

被管理端:

ans  ALL=(ALL) NOPASSWD: ALL` 密码是1,ssh端口是 22`

重新分发密钥给ans普通用户.

ssh-copy-id [email protected]

测试

ansible -i hosts web  -m ping

模块大全:https://www.processon.com/view/link/625774ce1efad407892af60b
提升自己:
1. 所有服务书写剧本
2. 书写所有服务合集剧本
3. 书写所有服务合集剧本 使用roles
4. 公有云实现或配置sudo权限实现

你可能感兴趣的:(linux,linux,运维)