1.ansible:一个批量的自动化部署工具
工作原理:ansible通过hosts文件和免秘钥(配置文件用户名密码端口号)来实现批量管理主机
ansible默认并发量-f:5
Ansible:Ansible的核心程序
Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Connection Plugins:连接插件,Ansible和Host通信使用
模块:1.yaml #用来编写yaml脚本的语言
2.paramiko #模拟ssh协议连接linux客户端
3.jinja2 #模板语言
2.Ansible优点:
●Stupied Simple ,上手简单,学习曲线平滑
●SSH by default ,安全,无需安装客户端
●配置简单、功能强大、扩展性强
●支持API及自定义模块,可通过Python轻松扩展
●通过Playbooks来定制强大的配置、状态管理
●提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台 #web界面收费,因此企业中都不用
●幂等性:一种操作重复多次结果相同
3.ansible安装
yum install epel-release
yum install ansible
4.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组下的所以客户端是否连通
5.ansible常用命令hoc命令行下:
●查看支持的模块: 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
将该行的注释去掉即可。
6.playbook
●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
7.roles介绍:提高代码的重用性
什么情况下用到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