Ansible
Ansible 自动化运维工具 基于python开发,可实现批量系统配置、批量程序部署、批量运行命令等
Ansible 安装
Ansible需要主机python版本达到2.7或以上;不支持windows系统
Centos6版本需要安装epel源之后才可以安装Ansible
安装包地址 https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/
Ansible 基本概念
任何安装Ansible的机器都可以是控制节点;
你可以从任意控制节点调用 /usr/bin/ansible 执行一条任务或 /usr/bin/ansible-playbook 读取剧本执行多个任务
使用Ansible管理的网络设备和服务器都是受管节点,受管节点也可以叫做 ‘主机‘
受管节点的列表;Ansible在管理某个节点前,需要将节点添加到 ”主机清单文件“ 中,清单文件可以为每个受管节点指定信息,列如IP、port 也可以把主机分成主机组管理
Ansible执行代码的单位,Ansible自带许多模块每个模块都有指定用途;可以通过任务调用单个模块
Ansible执行的单位,可以使用临时命令一次执行一个任务
任务的有序列表文件,可以重复读取剧本文件重复运行剧本内容的任务
Ansible 部署
控制节点和受管节点通信是通过openssh建立,建立通信时需要密码认证很不方便所以先做免密钥登陆
## 生成密钥对
ssh-keygen
## 拷贝公钥到受管节点
ssh-copy-id user@ip
vim /etc/ansible/hosts
[server_name]
10.0.0.2[2:3] ## 批量添加一个范围的受管节点IP
10.0.0.21 ## 添加指定的受管节点IP
ansible 主机/主机组 -m 模块 -a '模块参数'
Ansible 模块
检查目标主机是否在线
例:ansible 主机/主机组 -m ping
Centos 系统上安装命令
name:指定安装包的名字
state:latest(安装最新版本)、present(默认安装)、installed(安装)、absent(卸载)、removed(卸载)
例:ansible 主机/主机组 -m yum -a ‘name=httpd state=latest’
command 模块用来执行系统命令,但不支持shell下的特殊符号 如:| && 等...
例:ansible 主机/主机名 -m command -a 'echo 你好'
shell 模块和 command 模块使用方法基本一致,但可以支持shell的特殊符号
例:ansible 主机/主机名 -m shell -a 'cd /opt/ && touch a.txt'
service 模块用来管理 centos 上的服务的启动、关闭、重启、重载
name:服务名
state:started(启动)、stopped(停止)、restarted(重启)、reloaded(重载)
enabled:默认 no,将服务设置为开机自启
例:ansible 主机/主机名 -m service -a 'name=服务名 state=started enabled=yes'
file 模块用来创建文件、目录、链接文件
group:定义文件/目录的属组
owner:定义文件/目录的属主
mode:定义文件/目录的权限
dest:被链接到的路径,只应用于 state=link 的情况
src:被链接的源文件路径,只应用于 state=link 的情况
pecurse:递归设置文件的属性,只对目录有效
state:
directory:如果目录不存在,就创建
file:文件不存在,也不会创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,就创建;如果文件存在,就更新时间戳
absent:删除目录、文件或取消链接文件
例:ansible 主机/主机组 -m file -a 'path=/ect/a.txt state=touch'
user 模块用来创建用户
uid:指定uid
home:指定创建的家目录
groups:指定用户组
name:创建的用户名
shell:指定用户登陆的shell环境
remove:删除用户家目录,默认 no
password:设置密码,密码需要为密文
createhome:是否创建家目录 yes/no
state:创建/删除 (present,absent) 默认为 present
例:ansible 主机/主机组 -m user -a 'name=tom state=absent remove=yes' #删除tom用户并删除家目录
group 模块用来创建用户组
gid:指定gid
name:指定用户名
system:指定创建的用户在是否为系统组,false true 默认为false gid小于1000为系统组
state:创建/删除 (present,absent)
例:ansible -m group -a 'name=tom gid=6666 state=present'
copy 模块用来复制文件至目标主机
src:需要copy的文件或目录
dest:拷贝至目标主机的哪个路径,dest为必须参数
content:当不使用src指定拷贝文件时,可以使用content直接指定文件内容
backup:是否将目标主机同名文件备份 yes/no 默认no
force:当存在同名文件并且文件内容不同时,是否覆盖 yes/no 默认yes
mode:指定拷贝到目标主机后文件的权限
owner:指定拷贝到目标主机后文件的属主
group:指定拷贝到目标主机后文件的属组
directory_mode:递归授权
例:ansible all -m copy -a 'src=/etc/a.txt dest=/etc/'
unarchive 模块用来解压文件
copy:解压文件前,是否将文件复制到远程主机 yes/no 默认no
creates:指定一个文件名,当该文件存在时,则解压指令不执行
dest:存放解压后的文件的绝对路径 远程主机
group:解压后的目录或文件的属组
mode:解压后文件的权限
src:需要解压文件的绝对路径
owner:解压后文件或目录的属主
例:ansible 主机/主机组 -m unarchive -a ‘src=/root/nginx.tar.gz dest=/opt/ group=www ower=www mode=777’
get_url 模块主要用于http、ftp、https服务器上下载文件
url:指定要下载的文件的url地址
例:ansible webservers -m get_url -a ‘url=http://nginx.org/download/nginx-1.15.7.tar.gz dest=/root/’
使用rsync同步文件,将主控方目录推送到指定节点的目录下;使用此模块需要先安装rsync
delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no
src: 要同步到目的地的源主机上的路径,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制
dest:目的地主机上将与源同步的路径
dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。
mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。
rsync_opts:通过传递数组来指定其他rsync选项
fetch 模块用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。
src:远程系统上要获取的文件;这必须是一个文件,而不是一个目录
dest:保存文件的目录
flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为
setup 模块用于收集远程主机的一些基本信息
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
例:ansible 主机/主机组 -m setup -a 'filter=ansible_processor_vcpus'
script 模块在远程主机上执行主控制端的脚本,相当于 scp+shell
例:ansible 主机/主机组 -m script -a '/root/test.sh'
stat 模块用于获取远程文件的状态信息,包括atime、ctime、mtime、md5、uid、gid等...
例:ansible 主机/主机组 -m stat -a "path=/etc/sysctl.conf"
cron 模块远程主机crontab配置
例:ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom"
mount 模块挂载文件系统
src:设备文件路径
path:挂载点路径
fstype:挂载文件系统类型
opts:挂载方参数信息
state:
absent:卸载,清除fstab内的挂载信息
umounted:卸载,不清除fstab的挂载信息
present:不挂载,只添加到fstab文件
mounted:挂载,添加到fstab文件
例:ansible all -m mount -a 'apth=/tmp/app src=/dev/sdb fstype=ext4 state=mounted opts=rw'
Ansible 剧本
tasks 任务集
varniables 内置变量 或 自定义变量在playbook中调用
tmeplate 模板
handlers 和 notify结合使用,由特定条件触发的操作,满足条件就会执行,否则不执行
roles 角色
playbook使用yaml语法格式,后缀可以是yaml 或 yml
在playbook文件中,可以使用 ‘---’ 区分多个play,‘---’ 表示play的开始;‘...’ 用来表示play的结尾,可省略
使用 # 号注释代码
缩进必须同一,不能空格和tab混用
缩进级别必须一致,同样的缩进表示同样的级别,程序判断配置的级别是通过缩进结合换行实现
YAML文件内容区分大小写
k/v 的值可以同行写也可以换行写。同行使用 ‘ : ’ 分隔
v 可以是字符串,也可以是列表
一个完整的代码块功能至少需要 name: task
例:
vim playbook.yml
--- #固定格式
- hosts: 主机/主机组 #定义需要执行主机
remote_user: root #远程用户
become: yes #切换用户运行
become_user: mysql #切换用户为 mysql
vars: #定义变量
http_port: 8088 #变量
tasks: #定义一个任务的开始
tags: touch_playbook.txt #定义一个标签
- name: create new file #定义任务的名称
file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
- name: http_port
debug: msg="{{ http_port }}" #调用变量
ignore_errors: True #忽略错误,强制返回成功
notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
- restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致
handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
- name: restart apache #要与notify定义的内容相同
service: name=httpd state=restarted #触发要执行的动作
ansible-playbook name.yml 参数
参数:
-k 交互输入 ssh 密码
-K 输入 sudo 密码
-u 指定用户
--syntax-check 检查语法
--list-task 查看tasks任务
--list-hosts 查看生效主机
--start-at-task='copy nginx' 指定从某个task开始执行
##单条条件判断
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when: ansible_distribution == "CentOS"
##多条条件判断
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
##组条件判断
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
---
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: 'Install Httpd'
yum:
name: "{{ package }}"
state: latest
- name: 'Start Service'
service:
name: "{{ service }}"
state: started
##普通形式
---
- hosts: all
remote_user: root
tasks:
- name: 'Install Packages'
yum:
name: "{{ item }}"
state: latest
with_items:
- httpd
- mysql
- php
##键值对形式
---
- hosts: all
remote_user: root
tasks:
- name: 'Add User'
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
with_items:
- {name: 'test1', groups: 'wheel'}
- {name: 'test2', groups: 'root'}