一、ansible简介
ansible是一个自动化批量部署工具,底层是用python写的(paramiko,jinjia2(模板语言),yaml)
核心组件:
Ansible:ansible的核心程序
Playbooks:yaml格式文件,多个任务定义在一个文件中,使用时可以统一调用,‘剧本’用来调用哪些主机需要调用哪些模块来完成的功能。
Host Inventory:管理主机,记录了由每一个ansible管理的主机信息,包括ssh端口号,root用户密码,ip地址等,可以通过file加载,也可以通过CMDB加载。
Core Modules:核心模块,把常用命令模块化,Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。
Custom Modules:支持任意语言,自定义模块,完成Core Modules无法完成的功能。
Connection Plagins:连接作用,连接插件,Ansible和Host通信使用。
工作原理:
ansible加载hosts文件,通过免密钥或配置文件参数来批量管理主机。
优点:
ansible不需要安装客户端或agent(代理)
支持API和自定义模块
通过playbooks定制强大的配置,状态管理
配置简单,功能强大
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
幂等性:一次操作重复多次结果相同
ansible配置客户端(两种方法):
第一种:ssh免密登录
第二种:vim /etc/ansible/hosts在最低端写入要管理的主机
如:192.168.42.12 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root
二、ansible常用模块
①ping模块
[root@localhost ~]# ansible testhost -m ping 192.168.42.10 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.42.9 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.42.8 | SUCCESS => { "changed": false, "ping": "pong" }
②command模块
这个模块可以直接在远程主机上执行命令,并将结果返回本主机。
ansible testhost -m command -a 'ls -ltr'
③shell模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
ansible testhost -m shell -a 'rpm -qa | grep "http"'
④copy模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。(src是源文件,dest是目标文件,可以改名)
ansible testhost -m copy -a 'src=/root/1 dest=/tmp'
#给定内容生成文件,并制定权限
ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666' #connect可以直接指定文件的值(替换src)
#查看上条命令的执行结果
ansible testhost -m shell -a 'ls -l /tmp/'
#覆盖,原文件备份
ansible testhost -m copy -a 'content="I am keerya\n" backup=yes dest=/tmp/name mode=666'
⑤file模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。
⑥yum模块
name=要安装的包名 state有三种模式(present下载 latest下载最新版本 absent卸载)
ansible testhost -m yum -a 'name=httpd state=present'
⑦service模块
该模块用于服务程序的管理。
name=服务名称 state有started,stopped,restarted,reloaded四种模式,enabled开机自启。
ansible testhost -m service -a 'name=ntpd state=started enabled=true'
⑧user模块
该模块主要是用来管理用户账号。
#创建一个uid为11111的keer用户
ansible testhost -m user -a 'name=keer uid=11111'
#删除用户
ansible testhost -m user -a 'name=keer state=absent'
⑨scrip模块
该模块用于将本机的脚本在被管理端的机器上运行。直接指定脚本的路径即可
在服务端写一个脚本/tmp/test.sh
ansible testhost -m script -a '/tmp/test.sh'
⑩setup
查看用户信息
facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
ansible testhost -m setup
ansible testhost -m setup -a 'filter="*mem*"'
三、playbooks
一个任务叫做一个play,多个play组成的组合叫playbooks
①基础
- hosts: testhost remote_user: root tasks: - name: cteate user name user: name=jam1
②变量
- hosts: testhost #冒号后面必须有空格 remote_user: root vars: - packages: jam2 #等价于packages=jam2 tasks: #tasks的s不能少 - name: cteate user name #名字随便起,最好是任务的注释 user: name={{ packages }} #与变量呼应 - name: delete user: name=jam1 state=absent
③迭代
什么情况下可以用到迭代?
安装软件包;创建用户,组;删除用户,软件包等
- hosts: testhost #-和:后面必须都有空格 remote_user: root #用root用户执行 vars: - packages: jam2 tasks: - name: cteate user name user: name={{ packages }} - name: delete user: name=jam1 state=absent - name: yum install many user: name={{ item }} state=present #迭代固定格式 with_items: #固定 - jam0 - jam1 - jam2 - jam3
④触发器
只要执行文件就重启ntpd,类似于只要修改配置文件就重启服务
- hosts: testhost remote_user: root vars: - packages: jam2 tasks: - name: cteate user name user: name={{ packages }} - name: delete user: name=jam1 state=absent - name: yum install many user: name={{ item }} state=present with_items: - jam0 - jam1 - jam2 - jam3 notify: #触发器,固定 - restart ntp #随便起 handlers: #要与tasks对齐 - name: restart ntp #名字要与触发器名字一样 service: name=ntpd state=restarted
⑤模板
第一步:在root下创建templates目录
第二步:将目标文件复制到templates目录下并改名为以j2为后缀的文件
第三步:在yaml或yml文件里调用templates模块
第四步:把要拷贝的文件里的参数变为变量
第五步:在/etc/ansible/hosts文件里添加变量
四、roles
什么情况下用到roles
假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。(类似与函数,一次定义多次调用)
把每一个play封装到角色里面,调用时只需要添加角色就好了,提高复用率。
[root@localhost ~]# mkdir playbooks/roles/{webserver,dbserver}/{tasks,templates,vars,handlers,files} -pv
[root@localhost ~]# tree playbooks
playbooks
└── roles
├── dbserver
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
└── webserver
├── files
├── handlers
├── tasks
├── templates
└── vars
tasks
1.切换目录到/root/playbooks/roles/webserver/tasks
2编辑文件.vim main.yaml(文件名是固定的)
3.切换到/root/playbooks,与roles同级编辑文件vim site.yaml(文件名也是固定的)
4.执行ansible-playbook site.yaml
修改files
[root@localhost webserver]# cp /etc/httpd/conf/httpd.conf files/ #在webserver下复制etc/httpd/conf/httpd.conf到files目录下
[root@localhost tasks]# cd roles/webserver/tasks #修改后再写任务时就不用写绝对路径了,直接写文件名
[root@localhost tasks]# vim main.yaml #将你要执行的任务写入文件中
[root@localhost playbooks]# ansible-playbook site.yaml
vars,handlers
1.编辑vars(注意packages前面没有-)
2.编辑handlers
3.编辑tasks
4.ansible-playbook执行
templates
[root@localhost webserver]# cp files/httpd.conf templates/ [root@localhost webserver]# vim templates/httpd.conf #修改变量{{ port }}
编辑完成后在/etc/ansible/hosts添加变量