文章摘自: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系统来说相当与无需配置.
- no angents: 被管控节点无需安装agent
- no server: 无服务端,使用是直接调用命名
- modules in any languages: 基于模块工作, 可以使用任意语言开发模块
- 易读的语法: 基于yaml语法编写playbook
- 基于推送模式: 不同于puppet的拉取模式,直接由调用者控制变更在服务器上发生的时间
- 模块是幂等性的:定义的任务已存在则不会做任何事情,意味着在同一台服务器上多次执行同一个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相关的模块:

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"
网友评论