工做原理:ansible经过hosts文件和免秘钥(配置文件用户名密码端口号)来实现批量管理主机php
ansible默认并发量-f:5python
Ansible:Ansible的核心程序linux
Host Lnventory:记录了每个由Ansible管理的主机信息,信息包括ssh端口,root账号密码,ip地址等等。能够经过file来加载,能够经过CMDB加载git
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时能够统一调用,“剧本”用来定义那些主机须要调用那些模块来完成的功能.web
Core Modules:Ansible执行任何管理任务都不是由Ansible本身完成,而是由核心模块完成;Ansible管理主机以前,先调用core Modules中的模块,而后指明管理Host Lnventory中的主机,就能够完成管理主机。vim
Custom Modules:自定义模块,完成Ansible核心模块没法完成的功能,此模块支持任何语言编写。安全
Connection Plugins:链接插件,Ansible和Host通讯使用服务器
模块:1.yaml #用来编写yaml脚本的语言并发
2.paramiko #模拟ssh协议链接linux客户端ssh
3.jinja2 #模板语言
●Stupied Simple ,上手简单,学习曲线平滑
●SSH by default ,安全,无需安装客户端
●配置简单、功能强大、扩展性强
●支持API及自定义模块,可经过Python轻松扩展
●经过Playbooks来定制强大的配置、状态管理
●提供一个功能强大、操做性强的Web管理界面和REST API接口——AWX平台 #web界面收费,所以企业中都不用
●幂等性:一种操做重复屡次结果相同
yum install epel-release
yum install ansible
服务端:192.168.88.5
客户端:192.168.88.10
192.168.88.12
第一种方法:
1.server: ssh-keygen
2.scp id_rsa.pub root@192.168.254.25:/root/.ssh/authorized_keys
第二种方法:
第一步:[root@localhost ~]# vim /etc/ansible/hosts
在最后一行编写以下内容:
定义组名:[testhosts]
客户端用户名:ansible_ssh_user=root
客户端密码: ansible_ssh_pass=123456
第二步:[root@localhost ~]# vim /etc/ansible/ansible.cfg
将这行的注释去掉
第三步:测试跟客户端是否联通
[root@localhost ~]# ansible 192.168.88.10 -m ping
ansible all -m ping 查看全部客户端是否连通
ansible testhosts -m ping 查看testhosts组下的因此客户端是否连通
●查看支持的模块: ansible-doc -l
●查看模块用法:ansible-doc -s MODEL_NAME
●ansible命令应用基础
1.ansible <host-pattern> [options]6
-f forks:启动并发线程数
-m model_name:要使用的模块
-a args:特有的参数
设置forks数量:a.export ANSIBLE_FORKS=100在终端运行;
b.在配置文件ansible.cfg里设置forks=100便可;
c.运行命令时增长参数-f 100便可。
补充:线程是最小的调度单位,进程是最小的管理单元,一个进程里面至少1个线程,一个线程或者多个线程能够在一个进程里面
●查看client端是否正常ping通:ansible all -m ping
●查看客户端信息:ansible webserver -m setup
●copy文件到client端:ansible webserver -m copy -a 'src=/root/git_test/code.txt dest=/root/test'
实例:将服务端的liang文件复制到客户端下
[root@localhost ~]# ansible testhosts -m copy -a 'src=/root/liang dest=/root
●建立test用户:ansible webserver -m user -a "name=test state=present"
实例
● 删除test用户:ansible webserver -m user -a "name=test state=absent"
●yum安装:ansible webserver -m yum -a ‘name=epel-relese state=latest‘
实例:
[root@localhost ~]# ansible testhosts -m yum -a 'name=unzip state=latest'
●中止httpd服务:ansible webserver -m service -a ‘name=httpd state=stopped enabled=no‘
●运行脚本:ansible webserver -m script -a ‘/tmp/test.sh‘
●运行命令:ansible webserver -m command -a 'date'
实例:
若是命令模块使用的过程当中出现告警的解决办法:
[root@localhost ~]# vim /etc/ansible/ansible.cfg
将该行的注释去掉便可。
●tasks
●variables
●templates
●handlers
●roles
yaml介绍(剧本)
yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其余多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。
●yaml的可读性好
●yaml和脚本语言的交互性好
●yaml使用实现语言的数据类型
●yaml有一个一致的信息模型
●yaml易于实现
●yaml能够基于流程来处理
●yaml表达能力强,扩展性好
建立的yaml的文件格式:.yml/.yaml
执行:ansible-playbook -C copy.yaml -C模拟执行
ansible-playbook copy.yaml
6.1 基础剧本
剧本说明:
- hosts: all 指定主机组,能够理解为这个最大,顶个写
tasks: 指定下面一系列的动做,这个是第二,须要有两个空格
- name: 指定名称,排行第三,须要有三到四个空格
yum: 模块名 排行第四,须要有四到五个空格
handlers:指定处理器(触发器),排行第二,须要与tasks对齐
实例1:
6.2 剧本中使用变量
自定义变量的实现方式
1. 直接写在yaml文件中
2. 在Inventory file中定义
3. 变量的声明:
vars:
- 变量名: 变量值
4. 变量的引用:{{ var }}
5. vars和tasks同级,并要写在tasks前面
实例
6.3 剧本中使用触发器notify
notify触发的条件是当notify上边第一个命令执行成功(copy执行成功),会执行下面相对应的任务(systemctl restart httpd),handlers为触发的任务内容,- name必须和notify下的名字相同。handlers必须在最后。
6.4 剧本中使用迭代
迭代中的变量必须用item,固定格式
出现这个告警,进行以下操做便可
[root@localhost ~]# vim /etc/ansible/ansible.cfg
6.5 剧本中模板templates
将模块换成template,固定格式
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
[root@localhost ~]# vim /etc/ansible/hosts
什么状况下用到roles
假如咱们如今有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。咱们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,未来也不利于模块化调用,不利于屡次调。好比说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,咱们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。
1)tasks目录 tasks目录用于存放ansible执行的任务,tasks目录下必须存在main.yml文件,main.yml为主函数,用于导入须要执行的任务。
2)handlers 目录 handlers常常和notify搭配使用,当文件、进程及返回状态发生变化时,notify经过handlers作响应的变动。handlers目录下也须要包含main.yml,包含在在main.yml中的handlers将被执行
3)templates及file目录 templates目录及file目录均用于ansible目录文件处理,两个目录下均用于存放传输的文件,但templates目录下存放的是”.j2”格式的文件模板,文件中能够写变量。
4)vars目录 vars目录下用于定义当前roles执行时使用的变量,应当存在main.yml文件。
第一步:建立roles文件
[root@localhost ~]# mkdir -pv playbooks/roles/{webservers,dbservers}/{files,handlers,tasks,vars,templates}
[root@localhost ~]# tree playbooks/
第二步:编辑启动roles文件
[root@localhost playbooks]# vim site.yml #固定格式
roles:写你定义的角色
site.yml这个启动文件下能够添加不一样的组(hosts)
第四步:启动
[root@localhost playbooks]# ansible-playbook site.yml
第三步:
编辑tasks下的文件
[root@localhost ~]# vim playbooks/roles/webservers/tasks/main.yml #固定格式
file文件配置:
[root@localhost ~]# vim playbooks/roles/webservers/tasks/main.yml
[root@localhost ~]# cp /etc/httpd/conf/httpd.conf /root/playbooks/roles/webservers/files/ #将要复制的文件复制到files中
[root@localhost playbooks]# ansible-playbook site.yml
handlers
[root@localhost playbooks]# vim roles/webservers/tasks/main.yml
[root@localhost playbooks]# vim roles/webservers/handlers/main.yml
[root@localhost playbooks]# ansible-playbook site.yml
templates
[root@localhost playbooks]# vim roles/webservers/tasks/main.yml
将要操做的文件复制到templats中。
[root@localhost playbooks]# cp roles/webservers/files/httpd.conf roles/webservers/templates/
[root@localhost playbooks]# vim roles/webservers/templates/httpd.conf
[root@localhost playbooks]# vim /etc/ansible/hosts
[root@localhost playbooks]# ansible-playbook site.yml
vars
[root@localhost playbooks]# vim roles/webservers/vars/main.yml
[root@localhost playbooks]# vim roles/webservers/tasks/main.yml