anasible优化操作
1.优化ansible速度
Ansible使用默认的SSH方式通信,它的效率会远远低于StltStack的Zeromq消息队列。
但是依然有许多手段可以优化Ansible的执行速度。
(1)开启SSH长连接
Ansible对SSH的依赖性非常强,优化SSH将会优化Ansible的执行效率。
可以在ansible.cfg中设置SSH长连接。
ssh_args = -o ControlMaster=auto -o ControlPersist=5d
如果开启长连接,就会减少下次ssh的连接次数。
ControlPersist=5d表示长连接的时长为5天。
(2)开启pipelining
在整个Ansible的执行流程中,有一个过程就是把生成好的本地python脚本传输到各个节点上然后执行。
如果开启了pipelining,这个过程将会在ssh的会话中进行,可以提高整个执行效率。
pipelining = True
(3)开启accelerate模式
Ansible还有一个accelerate模式,这个模式会使用python程序在远端机器上运行一个守护进程,
然后Ansible会通过这个守护进程的监听端口进行通信。
[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
(4)设置facts缓存
在执行playbook的时候,默认第一个task都是GATHERING FACTS,就是收集每台主机的facts信息。
如果你不需要facts信息,那么可以在playbook中设置gather_facts:False来提高playbook的效率。
但是现在我想收集facts的信息,又想加速收集过程,此时就可以使用facts缓存了。
playbook文件:
ansible.cfg设置:
fact默认设置在memory里面,也就是不长时间保存。
fact_caching = memory
fact的缓存可以放在json文件、redis数据库里面等。
fact_caching = jsonfile
fact_caching_connection=/tmp/ansible_fact_cache
查看生成的日志:
它会用主机ip来生成一个json文件,然后写入当前主机的fact信息,这个节点再需要fact的时候就会直接读取这个文件。
2.目录结构
第一种方式是通过角色进行划分
production # 生产环境的inventory文件 staging # 暂存环境的inventory文件 group_vars/ #组变量定义 group1.yml group2.yml host_vars/ # 主机变量定义,为每台主机单独定义变量 hostname1.yml hostname2.yml library/ # 自定义模块存放目录 module_utils/ filter_plugins/ # 自定义filter插件存放目录 site.yml # playbook的统一入口文件 webservers.yml # web服务相关的playbook文件 dbservers.yml # 数据库相关的playbook文件,如果还有其它类型,可以继续创建 roles/ # role存放目录 common/ # common 角色目录,共用目录 tasks/ main.yml # common角色task入口文件 handlers/ main.yml # common角色handlers入口文件 templates/ ntp.conf.j2 # common角色templates文件 files/ bar.txt # common角色files资源文件 foo.sh # common角色files资源文件 vars/ main.yml # common角色变量定义文件 defaults/ main.yml # common角色默认变量定义文件,优先级低 meta/ main.yml # common角色依赖文件 library/ # 角色还可以包含自动一模块 module_utils/ lookup_plugins/ # 还可以包含lookup插件 webtier/ # webtier角色目录,与common同级 monitoring/ # monitoring角色目录,与common同级 fooapp/ # fooapp角色目录
第二种是通过环境进行环境进行划分,比如生产环境、测试环境获知开发环境等
inventories/ # inventory主要存放的是主机信息,默认是/etc/ansible/hosts production/ #生产环境 hosts #主机和主机组配置信息 group_vars/ #组变量 group1.yml group2.yml host_vars/ #主机变量 hostname1.yml hostname2.yml staging/ #测试环境 hosts group_vars/ group1.yml group2.yml host_vars/ stagehost1.yml stagehost2.yml library/ #自定义模块存放目录 module_utils/ filter_plugins/ #filter插件存放目录 site.yml #playbook统一入口文件 webservers.yml #web和db服务playbook文件 dbservers.yml roles/ #角色 common/ #共有 webtier/ #其它 monitoring/ fooapp/
如果你使用的是云主机,你不应该在静态文件中管理inventory,因为此时inventory信息是动态波动的。
你应该使用inventory插件或者脚本来实现。
3.灰度发布和语法检测
(1)语法检测
在编写完playbook之后一定要进行语法检测,否则一旦运用到生产环境将是一个大问题。
只需要在执行playbook的时候使用--syntax-check参数即可。
(2)灰度发布
在进行完语法检测之后,你应该先挑一台机器进行测试,将所有的任务跑一遍。
这样就可以直观感受是否能够达到预期效果。你只需要把一个或多个task使用deletgate_to参数指定到一台设备上进行测试。
(3)是否达到预期
在运行playbook的时候使用--diff和--check参数去对比生成后的文件是否为我们所需的文件。