ansible概述和运行机制
Ansible 概述
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作
官方网站:https://www.ansible.com/
Ansiblle特点
1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2、默认使用SSH协议对设备进行管理;
3、主从集中化管理;
4、配置简单、功能强大、扩展性强;
5、支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置、状态管理
7、对云计算平台、大数据都有很好的支持;
Ansible 工作机制
由上面的图可以看到 Ansible 的组成由 5 个部分组成:
Ansible : ansible核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
Inventory : 定义 Ansible 管理主机的清单 [ˈɪnvəntri] 清单
实战-安装并配置Ansible管理两个节点
安装ansible服务
ansible 服务端 centos-60 192.168.0.60
ansible节点1 centos-60 192.168.0.60
ansible节点2 centos-90 192.168.0.90
在centos-60上安装ansible
1、 设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
yum install epel-release -y
2、 使用yum安装Ansible
yum install ansible -y
ansible --version
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:
-v,-verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
inventory [ˈɪnvəntri] 库存
-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
-m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块
-a,MODULE_ARGS #指定 module 模块的参数
-k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的**认证
-sudo # 指定使用 sudo 获得 root 权限
-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移动端的执行用户
-C,-check #测试此命令执行会改变什么内容,不会真正的去执行
ansible-doc详细参数:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, snippet [ˈsnɪpɪt] 片断
3、定义主机清单
基于ssh**来访问定义主机清单
一般来说,使用明文密码不安全,所以增加主机无密码访问。
在Ansible服务端生成**,并且复制公钥到节点中。
ssh-****** #一直往下回车
使用ssh-copy-id命令来复制Ansible公钥到节点:centos-60和centos-60
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh 192.168.1.90
exit
vim /etc/ansible/hosts #在文件的最后添加以下内容
删除之前在最后添加的两行主机清单:
[web-servers]
192.168.0.60 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
增加:
[web-servers]
192.168.0.60
192.168.0.90
在Ansible服务端运行命令
ping模块检查网络连通性
command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令
ansible -i /etc/ansible/hosts web-servers -m ping
-i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块
ansible 'web-servers' -m ping #不指定,默认使用/etc/ansible/hosts文件
检查Ansible节点的运行时间(uptime)
ansible -m command -a "uptime" 'web-servers'
检查节点的内核版本
ansible -m command -a "uname -r" 'web-servers'
给节点增加用户
ansible -m command -a "useradd mk123" 'web-servers'
ansible -m command -a "grep mk123 /etc/passwd" 'web-servers'
将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中
ansible常见模块高级使用方法
command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;
shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。
运行free -m 命令
ansible -i /etc/ansible/hosts web-servers -m shell -a "free -m"
但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
如果待执行的语句少,可以直接写在一句话中:
ansible web-servers -m shell -a "source ~/.bash_profile && df -h | grep sda3"
因为centos-90不存在sda3,所以返回空
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
vim /etc/ansible/net.sh
#!/bin/bash
date
hostname
ansible web-servers -m script -a "/etc/ansible/net.sh"
copy模块:实现主控端向目标主机拷贝文件,类似scp功能
ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755"
ansible-doc copy
file模块设置文件属性
ansible -m file -a "path=/tmp/hosts mode=0777"
ansible-doc file
stat模块获取远程文件信息
ansible web-servers -m stat -a "path=/tmp/hosts"
get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验
ansible web-servers -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/tmp/ mode=0440 force=yes"
查看force=yes的作用
ansible-doc -s get_url
如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。
如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。
yum模块linux平台软件包管理
ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
yum模块可以提供的status状态: latest ,present,installed #这3个代表安装;removed, absent #这2个代表卸载
如果不知道模块名称怎么办
ansible-doc -l | grep yum
可以进行搜索,比如搜想知道有没有yum模块
ansible-doc yum
cron模块远程主机crontab配置
ansible web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
ansible-doc cron
service模块远程主机系统服务管理
想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
ansible web-servers -m service -a "name=httpd state=restarted enabled=yes"
state=started、stopped、restarted(重启)、reloaded
enabled=yes开机启动,设置为 no 表示不会开机启动
sysctl模块远程主机sysctl配置,改内核参数
ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
cat /proc/sys/net/ipv4/ip_forward
user模块远程主机用户管理
ansible web-servers -m user -a "name=centos state=present"
实战-使用Playbook批量部署多台LAMP环境
playbooks使用步骤
playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。
在playbooks 中定义任务:
- name: task description #任务描述信息
module_name: module_args #需要使用的模块名字: 模块参数
ansible-playbook 执行 命令:
ansible-playbook site.yml
playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。
github上提供了大量的实例供大家参考 https://github.com/ansible/ansible-examples
使用Playbook批量部署多台LAMP环境
Playbook常用文件夹作用:
files:存放需要同步到异地服务器的源码文件及配置文件;
handlers:当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件,handlers ['hændləz] 处理程序
meta:角色定义,可留空; meta ['metə] 元
tasks:需要进行的执行的任务;
templates:用于执行lamp安装的模板文件,一般为脚本; templates ['templɪts] 模板
vars:本次安装定义的变量