美文网首页
第五章:Ansible优化

第五章:Ansible优化

作者: chenkang | 来源:发表于2019-10-17 09:54 被阅读0次

    文章摘自:https://www.jianshu.com/p/c82737b5485c

    第一节:常用的自动化运维工具的比较:

    项目 Puppet SaltStack Ansible
    开发语言 Ruby Python Python
    是否有客户端
    是否支持二次开发 不支持 支持 支持
    服务器与远程机器是否相互验证
    服务器与远程机器的通信是否加密 是,标准的SSL协议 是,使用AES加密 是,使用OpenSSH
    平台支持 AIX , BSD, HP-UX, Linux , Mac OSX , Solaris, Windows BSD, Linux , Mac OS X , Solaris, Windows AIX , BSD , HP-UX , Linux , Mac OS X , Solaris
    是否提供Web UI 提供 提供 提供,但是是商业版本
    配置文件格式 Ruby 语法格式 YAML YAML
    命令行执行 不支持,大师可以通过配置模块实现 支持 支持

    第二节:Ansible的一些特性

    部署简单, 只需要在控制主机上部署ansible环境,被控制端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置.

    1. no angents: 被管控节点无需安装agent
    2. no server: 无服务端,使用是直接调用命名
    3. modules in any languages: 基于模块工作, 可以使用任意语言开发模块
    4. 易读的语法: 基于yaml语法编写playbook
    5. 基于推送模式: 不同于puppet的拉取模式,直接由调用者控制变更在服务器上发生的时间
    6. 模块是幂等性的:定义的任务已存在则不会做任何事情,意味着在同一台服务器上多次执行同一个playbook是安全的

    第三节:ansible速度优化

    1.SSH Multiplexing

    ansible运行playbook时会启动很多ssh连接来执行复制文件,运行命令这样的操作.openssh支持这样一个优化,叫做ssh Multiplexing,当使用这个ssh Multiplexing的时候,多个连接到相同主机的ssh回话会共享相同的TCP连接,这样就只有第一次连接的时候需要进行TCP三次握手.

    ansible会默认使用ssh Multiplexing特性,一般不需要更改配置,相关的配置项为:

    [ssh_connection]
    control_master = auto # 套接字不存在的情况下自动创建
    control_path = $HOME/.ansible/cp/ansible-ssh-%h-%p-%r # 连接套接字存放的位置
    control_persist = 60s  # 60s没有ssh连接就关闭主连接
    

    2. pipelining

    ansible执行过程中,他会基于调用的模块生成一个python脚本,然后将python脚本复制到主机上,最后执行脚本.ansible支持一个优化,叫做pipelining,在这个模式下ansible执行脚本时并不会去复制它,而是通过管道传递给ssh会话,这会让ansible的ssh会话从2个减少到1个,从而节省时间.

    pipelining默认是关闭的, 因为他需要确认被管理主机上的/etc/sudoers文件中的requiretty没有启用, 格式如下:

    Defaults: <username> !requiretty
    

    ansible开启pipelining方法, 修改ansible.cfg配置文件:

    [defaults]
    pipelining = True
    

    3.并发数

    ansible默认并发数是5,可以用下面两种方法修改并发数:

    • 环境变量方式
    export ANSIBLE_FORKS=20
    
    • 设置ansible.cfg
    [defaults]
    forks = 20
    

    第四节:fact缓存(速度优化)

    1.关闭fact

    ansible playbook会默认先收集fact信息,如果不需要fact数据可以在playbook中禁用fact采集:

    - name: not need facts
      hosts: myhosts
      gather_facts: False
      tasks:
        ...
    

    也可以全局禁用fact采集:

    [defaults]
    gathering = explicit
    

    另一种解决方案就是使用fact缓存,目前ansible支持下面几种fact缓存:

    • JSON文件
    • Redis
    • memcached

    2.JSON文件做fact缓存示例

    ansible把采集到的fact写入控制主机的json文件中,如果文件已经存在,那么ansible不会再去主机上采集fact

    启用JSON文件缓存,修改ansible.cfg文件:

    [defaults]
    gathering = smart
    
    # 设置超时时间
    face_caching_timeout = 86400
    
    # 使用JSON文件做为缓存后端
    fact_caching = jsonfile
    fact_caching_connection = /tmp/ansible_fact_cache
    

    3. Redis fact缓存后端

    使用redis作为fact缓存后端,需要在控制主机上安装redis服务并保持运行。需要安装python操作redis的软件包。

    ansible.cfg配置如下:

    [defaults]
    gathering = smart
    fact_caching_timeout = 86400
    fact_caching = redis
    

    4. Memcached fact缓存后端

    使用memcached作为fact缓存后端,需要在控制主机上安装Memcached服务并保持运行,需要安装python操作memcached的软件包。

    ansible.cfg配置如下:

    [defaults]
    gathering = smart
    fact_caching_timeout = 86400 
    fact_caching = memcached
    

    转载于:https://www.cnblogs.com/breezey/p/9273205.html

    第五节:ansible 与 docker

    ansible内置多种云计算相关模块,如aws,openstack,docker等,下图是ansible与docker相关的模块:

    img

    1. 使用ansible创建docker镜像

    通过playbook和dockerfile相结合的方式生成镜像, 示例如下:

    FROM ansible/ubuntu14.04-ansible:stable
    MAINTAINER xxx
    
    ADD ansible /srv/ansible
    WORKDIR /srv/ansible
    
    RUN ansible-playbook web-app.yaml -c local
    
    VOLUME /srv/project/static
    
    WORKDIR /srv/project
    
    EXPOSE 8000
    
    CMD ["gunicorn_django", "-c", "gunicorn.conf.py"]
    

    2.启动容器

    ansible可以通过docker模块来操作容器,示例如下:

    # docker run -p 6379:6379 --name redis -d redis:4.0.1
    - name: create container
      docker_container:
        name: "{{ container_name }}"
        image: "{{ container_image }}"
        ports:
          - "6379:6379"
    

    相关文章

      网友评论

          本文标题:第五章:Ansible优化

          本文链接:https://www.haomeiwen.com/subject/rncmmctx.html