Ansible的安装/概念/部署/模块/剧本

Ansible

Ansible	自动化运维工具 基于python开发,可实现批量系统配置、批量程序部署、批量运行命令等

Ansible 安装

Ansible需要主机python版本达到2.7或以上;不支持windows系统

Centos6版本需要安装epel源之后才可以安装Ansible

安装包地址 https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/

源码安装教程 Github

Ansible 基本概念

  • 控制结点(control node)
任何安装Ansible的机器都可以是控制节点;
你可以从任意控制节点调用 /usr/bin/ansible 执行一条任务或 /usr/bin/ansible-playbook 读取剧本执行多个任务
  • 受管节点
使用Ansible管理的网络设备和服务器都是受管节点,受管节点也可以叫做 ‘主机‘
  • 清单(inventory)
受管节点的列表;Ansible在管理某个节点前,需要将节点添加到 ”主机清单文件“ 中,清单文件可以为每个受管节点指定信息,列如IP、port 也可以把主机分成主机组管理
  • 模块(Modules)
Ansible执行代码的单位,Ansible自带许多模块每个模块都有指定用途;可以通过任务调用单个模块
  • 任务(Tasks)
Ansible执行的单位,可以使用临时命令一次执行一个任务
  • 剧本(Playbook)
任务的有序列表文件,可以重复读取剧本文件重复运行剧本内容的任务

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 语法格式
ansible	主机/主机组	-m 模块	-a '模块参数'

Ansible 模块

  • ping
检查目标主机是否在线

例:ansible	主机/主机组	-m	ping
  • yum
Centos	系统上安装命令

name:指定安装包的名字
state:latest(安装最新版本)、present(默认安装)、installed(安装)、absent(卸载)、removed(卸载)

例:ansible 主机/主机组 -m yum -a ‘name=httpd state=latest’
  • command
command 模块用来执行系统命令,但不支持shell下的特殊符号 如:| &&...

例:ansible	主机/主机名	-m	command	-a 'echo 你好'
  • shell
shell 模块和 command 模块使用方法基本一致,但可以支持shell的特殊符号

例:ansible	主机/主机名	-m	shell	-a 'cd /opt/	&&	touch a.txt'
  • service
service 模块用来管理 centos 上的服务的启动、关闭、重启、重载

name:服务名
state:started(启动)、stopped(停止)、restarted(重启)、reloaded(重载)
enabled:默认 no,将服务设置为开机自启

例:ansible	主机/主机名	-m	service	-a 'name=服务名	state=started	enabled=yes'
  • file
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
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
group 模块用来创建用户组

gid:指定gid
name:指定用户名
system:指定创建的用户在是否为系统组,false	true 默认为false	gid小于1000为系统组
state:创建/删除 (present,absent)

例:ansible	-m  group  -a  'name=tom  gid=6666  state=present'
  • copy
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
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
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/’
  • synchronize
使用rsync同步文件,将主控方目录推送到指定节点的目录下;使用此模块需要先安装rsync

delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no 
src: 要同步到目的地的源主机上的路径,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制 
dest:目的地主机上将与源同步的路径
dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。 
mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。 
rsync_opts:通过传递数组来指定其他rsync选项

  • fetch模块
fetch 模块用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。 
src:远程系统上要获取的文件;这必须是一个文件,而不是一个目录
dest:保存文件的目录
flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为
  • setup
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
script 模块在远程主机上执行主控制端的脚本,相当于 scp+shell

例:ansible	主机/主机组	-m script	-a '/root/test.sh'
  • stat
stat 模块用于获取远程文件的状态信息,包括atime、ctime、mtime、md5、uid、gid等...

例:ansible	主机/主机组 	-m stat	 -a  "path=/etc/sysctl.conf"
  • cron
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
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 剧本

  • Playbook核心元素
tasks			任务集
varniables		内置变量 或 自定义变量在playbook中调用
tmeplate		模板
handlers 和 notify结合使用,由特定条件触发的操作,满足条件就会执行,否则不执行
roles			角色
  • Playbook语法
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      #触发要执行的动作
  • Playbook 常用命令
ansible-playbook    name.yml    参数

参数:

	-k	交互输入 ssh 密码
	-K	输入 sudo 密码
	-u	指定用户

	--syntax-check				   检查语法
	--list-task					   查看tasks任务
	--list-hosts				   查看生效主机
	--start-at-task='copy nginx'	指定从某个task开始执行
  • Playbook 条件判断
##单条条件判断
---
- 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'}
发布了38 篇原创文章 · 获赞 6 · 访问量 3355

猜你喜欢

转载自blog.csdn.net/SKTONE_SHUAI/article/details/104502479