ansible自动化运维工具
一、ansible简介
ansible是自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍;
基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现;
配置文件:
(1)ansible应用程序的主配置文件:/etc/ansible/ansible.cfg
(2) Host Inventory定义管控主机:/etc/ansible/hosts
中括号中的字符是组名(可以更改);一个主机可同时属于多个组
扩展:连续域名可以定义:
www.[1:60] .benet.com
# SUCCESS 成功 changed false 没有改变 ping pong 通了
ansible-doc -l #查看支持的所有模块
ansible-doc -s 模块name #查看模块用法,获取指定模块的使用信息
|
<host-pattern> |
指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有 |
[-f forks] |
指明每批管控多少主机(启动并发线程数),默认为5个主机一批次 |
[-m module_name] |
使用何种模块管理操作,所有的操作都需要通过模块来指定 |
[-a args] |
特有的参数,指明模块专用参数;args一般为key=value格式
|
键值对=Key Value
键:就是你存的值的编号(变量)
值:就是你要存放的数据
实例练习: ansible all -m ping #查看client端是否正常ping通 ansible webservers -m copy -a 'src=/root/git_test/code.txt dest=/root/test' #批量copy文件到cient端 #指定组webservers 调用模块 copy -a 是命令格式的参数 原文件路径 (所有组内成员的)目标地址路径 出现CHANGED成功 ansible webservers -m user -a "name=test state=present" #批量创建test用户,想要创建系统用户,再加system=true ansible webservers -m user -a "name=test state=absent" #批量删除test用户 ansible webservers -m yum -a ‘name=epel-relese state=latest‘ #yum安装 ansible webservers -m service -a ‘name=httpd state=stopped enabled=no‘ #停止httpd服务 ansible webservers -m script -a ‘/tmp/test.sh‘ #运行脚本 ansible webservers -m command -a 'date' #查看时间
(1)核心元素
Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色
(2)playbooks中定义任务:
- name: task description 注释描述信息
module_name: module_args 声明模块:定义ansible模块参数
(3)ansible-playbook执行命令:
ansible-playbook <filename.yml> ... [options]
- hosts: webservers #表名 remote_user: root #用户 vars: tasks: #任务 - name: yum install httpd #操作任务名字 yum: name=httpd state=latest #调用yum模块,要yum的服务httpd,选择的状态=最新的 - name: service start httpd
service: name=httpd state=started
- hosts: webservers remote_user: root vars: - packages: tree #把tree赋予packages变量 tasks: - name: yum install tree yum: name={{ packages }} state=latest #可直接调用变量 - name: create user user: name=user1
- hosts: webservers remote_user: root vars: - packages: tree tasks: - name: yum install tree yum: name={{ packages }} state=latest - name: create user user: name=user1 - name: create many user user: name={{ item }} state=absent with_items: #固定不许变 - user1 #需要迭代的用户名 - user2 - user3 - user4 - user5 - user6
- hosts: webservers remote_user: root vars: - packages: tree tasks: - name: yum install tree yum: name={{ packages }} state=latest - name: create many user user: name={{ item }} state=absent with_items: - user1 - user2 - name: cp httpd.conf #如果执行这个成功 copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: #触发器 - restart httpd #这个名字的触发器(同下面名字一样) handlers: - name: restart httpd service: name=httpd state=restarted
- hosts: webservers remote_user: root vars: - packages: tree tasks: - name: yum install tree yum: name={{ packages }} state=latest - name: create many user user: name={{ item }} state=absent with_items: - user1 - user2 - name: cp httpd.conf template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #拷贝 notify: - restart httpd handlers: - name: restart httpd dervice: name=httpd state=restarted
- hosts: webservers remote_user: root vars: - packages: tree tasks: - name: yum install tree yum: name={{ packages }} state=latest - name: create many user user: name={{ item }} state=absent tags: - add_user with_items: - user1 - user2 - name: cp httpd.conf template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: - restart httpd handlers: - name: restart httpd dervice: name=httpd state=restarted
roles以特定的层次型格式组织起来的playbook元素(variables,tasks, templates, handlers);
可被playbook以role的名字直接进行调用;
用法:在roles/下建立[group_name]子目录,并非全部都要创建;例如:
/etc/ansible/roles/(在/etc/ansible/ansible.cfg定义roles目录)
webserver/
files/:此角色中用到的所有文件均放置于此目录中;
templates/:Jinja2模板文件存放位置;
tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件;
handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件;
vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件;
meta/:此角色的特殊设定及依赖关系;