ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购。是基于Python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能
自动化部署APP
自动化管理配置项
自动化持续交付
自动化(AWS)云服务管理
具备 Linux 服务器 (server) 基础操作和管理经验。
会使用 ssh 远端连线至 server。
知道基本的标准输入 (stdin) 输出 (stdout) 等观念。
会安装 Linux 套件。
知道 sudo 指令在做什么,并且会使用它。
知道什么是档案权限,并且会修改它。
知道如何启用和停止系统服务 (Daemon / Service)。
会撰写简易的脚本 (Script)。
自定义yum仓库更新索引文件
createrepo --update .
安装及验证
在 ansible 托管主机上配置 yum 配置文件
安装 yum install ansible
验证 ansible --version
CentOS 安装
新增 epel-release 第三方套件来源。
sudo yum install -y epel-release
安装 Ansible。
sudo yum install -y ansible
首先检测ANSIBLE_CONFIG变量定义的配置文件
其次检查当前目录下的 ./ansible.cfg 文件
再次检查当前用户家目录下 ~/ansible.cfg 文件
最后检查/etc/ansible/ansible.cfg文件
/etc/ansible/ansible.cfg是ansible的默认配置文件路径
[root@ansible /]# ls /etc/ansible
ansible.cfg hosts
ansible.cfg 配置文件
inventory 定义托管主机地址配置文件路径名
[root@ansible /]# vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts
ansible.cfg 配置文件
ssh 主机 key 验证配置参数
[root@ansible /]# vim /etc/ansible/ansible.cfg
host_key_checking = False
如果为 False,不需要输入 yes
如果为 True,等待输入 yes
inventory 指定的配置文件,写入远程主机的地址。
配置主机文件
格式:
#表示注释
[组名称]
主机名称或ip地址,其他参数
[root@ansible /]# vim /etc/ansible/hosts
[web] #web组名称,下面2台web主机
web [1 : 2] #1:2为web1到web2两台主机,1:20为web1到web20多台主机
[db] #数据库组,下面2台数据库主机
db1 ansible_ssh_port=222 #db1可以写成主机名称或ip地址,ansible_ssh_port=222表示ansible用ssh服务连接的时候是用222端口,定义这台机器的单独变量
db2
[other]
cache
ansible_ssh_port
ssh端口号:如果不是默认的端口号,通过此变量设置
[db] #数据库组,下面1台数据库主机
db1 ansible_ssh_port=222 #db1可以写成主机名称或ip地址,ansible_ssh_port=222表示ansible用ssh服务连接的时候是用222端口
ansible_ssh_user
默认的ssh用户名
[db] #数据库组,下面1台数据库主机
db1 ansible_ssh_user="root"
ansible_ssh_pass
默认的ssh用户名密码 (这种方式并不安全,强烈建议使用–ask-pass
或SSH密钥)
ansible_ssh_pass=“a”
ansible_ssh_private_key_file
ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
[all:vars]
ansible_ssh_user="root"
ansible_ssh_pass="a"
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible" #这个路径要写对应的秘钥文件,ssh服务生成秘钥的文件路径在/root/.ssh/id_rsa
[all:vars] #all表示所有组,也可以定义一个组或一台主机,下面表示这些组配置统一的变量
ansible_ssh_private_key_file="/root/.ssh/key"
children 子组定义,用于引用其他组名称
[app:children] #app定义的话就是ansible不识别是主机还是组,加上children,定义子组,单独把这些组加入到这个子组里
web
db
自定义配置文件
创建文件夹myansible #这个名字可以随便取
创建配置文件ansible.cfg
[defaults] #这个固定格式
inventory = /var/myansible/myhost #这个名字,路径可以随便取但是要创建和配置
host_key_checking = False
inventory指定的自定义配置主机文件
[root@ansible /]# vim /var/myansible/myhost
[app1] #自定义分组
web1
db1
• ansible 主机集合 -m 模块名称 -a 模块参数
主机集合 主机名或分组名,多个使用"逗号"分隔
-m 模块名称,默认 command 模块
-a
or --args 模块参数
• 其他参数
-i inventory文件路径,或可执行脚本
-k 使用交互式登录密码
-e 定义变量
-v 显示详细信息
命令格式: ansible 组名或主机名 -m [ 调用模块名] -a [模块命令]
列出要执行的主机
ansible all --list-hosts
调用ping模块批量检测主机
ansible all -m ping -k
[root@ansible /]# ansible all -m ping -k
SSH password: #出现交互,要求输入密码
ansible 是通过 SSH 在远程执行命令的
ssh 远程执行命令必须要通过认证才行
• 密码写入配置文件安全性很差
• 使用key方式认证
• 给所有主机部署公钥
没有秘钥命令执行会出错
ansible web -a ‘uptime’
创建一对密钥
ssh-keygen -t rsa -b 2048 -N '' -f key
给所有主机部署密钥
ssh-copy-id -i key.pub 主机名称
ansible-doc和ping模块
• ansible-doc
模块的手册相当与shell的man,很重要
ansible-doc -l #列出所有模块
ansible-doc modulename #查看帮助
• ping 模块
测试网络连通性, ping模块没有参数
注:测试ssh的连通性
ansible [组名|主机集合] -m ping
command模块
默认模块,远程执行命令
格式: ansible [组名|主机名] -m [模块名] -a ‘[args]’
查看所有机器负载
ansible all -m command -a ‘uptime’
查看日期和时间
ansible all -m command -a ‘date +%F_%T’
command模块注意事项:
该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功 “<” , “>” , “|” , “&”
command 模块不能解析系统变量
该模块不启动shell直接在ssh进程中执行,所有使用到
shell的命令执行都会失败
下列命令执行会失败
ansible all -m command -a ‘ps aux|grep ssh’
ansible all -m command -a ‘set’
shell模块
shell 模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令,不能执行交互式的命令,例如 vim top 等
查看所有机器的负载
ansible all -m shell -a ‘uptime’
ansible web -m shell -a “echo ${HOSTNAME}” #在当前终端解析
ansible web -m shell -a ‘echo ${HOSTNAME}’ #在连接后执行机器上解析
变量解析
ansible 执行命令是二次解析,第一次在本机解析, 第二次在执行机器解析需要第二次解析的变-量要转移()
ansible cache -m shell -a ‘cd /tmp’ #连接主机后切换目录
ansible cache -m shell -a ‘touch testfile’ #连接主机后切换脚本
ansible 是使用 ssh 多次连接执行,连接退出以后之前的状态就全部失效了
解决方法:使用 chdir 代替 cd 命令
ansible cache -m shell -a 'chdir=/tmp touch testfile
script模块
• script模块
在本地写脚本,然后使用script模块批量执行
ansible t1 -m script -a ‘脚本名称’
注意:该脚本包含但不限于shell脚本,只要指定Sha-bang解释器的脚本都可运行
yum模块
使用yum包管理器来管理软件包
name:要进行操作的软件包名字
state: 动作(installed, removed)
install
=== installed
remove === removed
格式: ansible [组名|主机名] -m yum -a ‘name="软件名称"state=动作(安装|删除)’
给所有db 主机安装 mariadb
ansible db -m yum -a 'name="mariadb-server"state=installed'
cache 主机删除lrzsz
ansible cache -m yum -a 'name="lrzsz" state=removed'
service模块
name:必选项,服务名称
enabled:是否开机启动 yes|no
sleep:执行restarted,会在stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
格式: ansible [组名|主机名] -m service(模块名) -a 'name=软件名称 enabled(开机启动)=yes|no(开|关) state(状态)=“启动,停止、重启、重新加载”
ansible all -m service -a ‘name=sshd enabled=yes state=started’
copy模块
复制文件到远程主机
src:复制本地文件到远程主机,绝对路径和相对路径都可,路径为目录时会递归复制。若路径以"/“结尾,只复制目录里的内容,若不以”/"结尾,则复制包含目录在内的整个内容,类似于rsync
dest:必选项。远程主机的绝对路径,如果源文件是一个目录,那该路径必须是目录
backup:覆盖前先备份原文件,备份文件包含时间信息。有两个选项:yes|no
force:若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制。默认为yes
格式:ansible [组名|主机名] -m [模块名] -a ‘源参数路径 目标参数路径’
复制文件
ansible all -m copy -a ‘src=/etc/resolv.conf
dest=/etc/resolv.conf’
复制目录
ansible all -m copy -a ‘src=/etc/yum.repos.d/
dest=/etc/yum.repos.d/’
lineinfile 模块 (匹配行级修改)
类似sed的一种行编辑替换模块
path 目标文件文件
regexp 正则表达式,要修改的行
line 最终修改的结果
格式:ansible [组名|主机名] -m [模块名] -a ‘path=目标文件文件 regexp=正则表达式,要修改的行 line=最终修改的结果’
例如修改 my.cnf,中 bin-log 的格式 mixed --> row
ansible db -m lineinfile -a 'path="/etc/my.cnf"regexp="^binlog-format" line=“binlog-format = row” ’
replace模块 (匹配字符级修改,更精准匹配)
类似sed的一种行编辑替换模块
path 目的文件
regexp 正则表达式
replace 替换后的结果
格式: ansible [组名|主机名] -m [模块名] -a ‘path=目标文件文件 regexp=正则表达式,要修改字符 replace =替换后的结果’
替换指定字符 row --> mixed
ansible db -m replace -a 'path="/etc/my.cnf"regexp="row"replace=“mixed” ’
setup模块
主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块下经常
用的是filter参数
filter过滤所需信息
ansible cache -m setup -a ‘filter=ansible_distribution’
也可以这样使用 ansible cache -m setup 用于收集目标主机信息
格式:ansible [组名|主机名] -m [模块名] -a ‘filter=ansible_匹配条件’
file模块
设置文件的属性
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state选项:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
格式:ansible [组名|主机名] -m [模块名] -a ‘src=被链接的源文件路径 dest=被链接到的路径 state=选项’
远程文件符号链接创建
ansible storm_cluster -m file -a “src=/etc/resolv.conf dest=/tmp/resolv.conf state=link”
远程文件符号链接删除
ansible storm_cluster -m file -a “path=/tmp/resolv.conf state=absent”
远程文件信息查看
ansible storm_cluster -m command -a “ls -al /tmp/resolv.conf”
service:系统服务管理
cron:计划任务管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
更多模块可以参考:ansible-doc –l
playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;
执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;
task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;
notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。
一些学习资料:
http://blog.xiaorui.cc/category/ansible/
http://lixcto.blog.51cto.com/4834175/d-4
https://github.com/ansible/ansible-examples
http://rfyiamcool.blog.51cto.com/1030776/d-51
http://dl528888.blog.51cto.com/2382721/d-4/p-1
http://edu.51cto.com/course/course_id-2220.html
http://edu.51cto.com/course/course_id-2032.html
http://www.shencan.net/index.php/category/自动化运维/ansible/