第一部分:基础
一、安装方法
1、使用centos的epel源安装
yum –y install ansible
主配置文件:/etc/ansible/ansible.cfg
Inventory文件:/etc/ansible/hosts
2、认证方式:
2.1 基于密钥
①生成密钥 ssh-keygen -t rsa
②将公钥复制到每台主机上
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
2.2 在inventory中制定(不推荐)
3、资产配置(首先把/etc/ansible/hosts文件中内容清空)
在Inventory文件配置ansible的客户端
方法:
①使用ssh端口
例:192.168.88.134:5309
②主机别名
例:
目标主机为192.168.88.136,端口号 5555,主机别名orcalserver
orcalserver ansible_ssh_port=5555 ansible_ssh_host=192.168.88.136
③通配符配置
例:
目标主机从linux-node2.example.com 到 linux-node50.example.com
linux-node[2:50].example.com
例子:[root@linux-node1 ~]# cat /etc/ansible/hosts
[webservers]
192.168.88.134
[dbservers]
192.168.88.136
4、测试是否安装成功:ansible all –m ping
192.168.88.134 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.88.136 | SUCCESS => {
"changed": false,
"ping": "pong"
}
备注:
在安装完成后,运行ansible all –m setup 以后会显示许多主机信息,这些主机信息存放在/etc/ansible/hosts文件中
/etc/ansible/hosts 是一个资产配置文件,里面得到webservers、dbservers属于主机的哪个组。
5、执行一条命令
[root@linux-node1 ~]# ansible all -a 'echo Hello World'
192.168.88.134 | SUCCESS | rc=0 >>
Hello World
192.168.88.136 | SUCCESS | rc=0 >>
Hello World
二、资产配置中的常用变量
变量名 |
参数含义 |
ansible_ssh_host |
指定远程主机 |
ansible_ssh_port |
指定ssh连接端口 |
ansible_ssh_user |
指定ssh连接用户 |
ansible_ssh_pass |
指定ssh连接密码 |
ansible_python_interpreter |
目标主机python进程 |
三、指定目标主机
格式:ansible
备注信息:
pattern 声明需要操作的目标主机
module_name 声明需要的模板是哪一个
arguments 用于传递参数给模板
例子:
1、指定所有的主机
ansible all -m shell -a 'uptime'
2、指定特定的主机组
ansible webservers:dbservers -m shell -a 'uptime'
3、制定一个主机组
ansible webservers -m shell -a 'uptime'
四、常用的命令示例
1、命令执行
Ø 重启主机 ansible all –a “/sbin/reboot” –f 10
Ø shell模块 ansible all -m shell -a "echo $TERM"
Ø 底层ssh 模块 ansible all -m raw -a "hostname --fqdn"
2、文件操作
Ø 下发文件
ansible all –m copy –a "src=/etc/hosts dest=/tmp/hosts"
Ø 为文件赋予权限
ansible all -m file -a "dest=a.txt mode=600 owner=demo group=demo"
Ø 创建文件夹
ansible all –m file –a “dest=/path/to/c mode=644 owner=demo group=demo state=directory”
Ø 删除文件
ansible all –m file –a “dest=/path/to/c state=absent”
3、包管理操作(yum)
Ø 安装
ansible webservers –m yum –a “name=httpd state=installed”
Ø 安装指定版本的包
ansible webservers –m yum –a “name=httpd-2.6 state=installed”
Ø 安装最新版本的包
ansible webservers –m yum –a “name=httpd state=latest”
Ø 卸载安装包
ansible webservers –m yum –a “name=httpd state=removed”
4、用户管理(user)
Ø 增加用户
ansible all –m user –a “name=tom password=123456”
Ø 删除用户
ansible all –m user –a “name=tom state=absent”
5、版本管理(git)
Ø 使用git拉取文件
ansible all –m git –a “repo=git://demo/repo.git dest=/srv/myapp version=HEAD”
6、服务管理(service)
Ø 启动服务
ansible all –m service –a “name=httpd state=started”
Ø 重启服务
ansible all –m service –a “name=httpd state=restarted”
Ø 停止服务
ansible all –m service –a “name=httpd state=stopped”
7、后台管理
Ø 运行一个执行360秒的后台操作
ansible all –B 360 –a “/usr/bin/long_running_operation –to-stuff”
Ø 检查作业状态
ansible all –m async_status –a “jid=1311”
Ø 后台运行1800秒,每60秒检查一下作业状态
ansible all –B 1800 –P 360 –a “/usr/bin/long_running_operation –to-stuff”
8、设备信息检查
ansible all –m setup
第二部分:Asible 常用模块
ansible-doc -l #可以直接查看内置模块
ansible-doc -s file #file为模块名
一、文件管理模块
1、文件组装模块——assemble(主要用于把多份配置文件片段组装成一个配置文件)
Ø 将/root/demo下的片段组装后放到/root/target目录下
ansible all –m assemble –a “dest=/root/demo src=/root/target”
assemble模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
backup |
否 |
no |
yes/no |
是否创建一份备份文件 |
delimiter |
否 |
- |
- |
配置文件片段之间的分割符 |
dest |
是 |
- |
- |
生成路径 |
others |
否 |
- |
- |
文件模块参数 |
src |
是 |
- |
- |
片段文件夹路径 |
2、文件复制模块——copy
文件复制模块常用于集中下发的动作,假如远端主机装有selinux,那么还需在目标主机上安装libselinux-python模块才能使用copy模块。
Ø 将/tmp/test 复制到所有机器的/root/目录下
ansible all –m copy –a “dest=/root src=/tmp/test”
copy模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
backup |
否 |
no |
yes/no |
是否备份原始文件 |
content |
否 |
- |
- |
当用content代替src参数时,可以把文档的内容设置为特定的值 |
dest |
是 |
- |
- |
文件复制的目的地 |
force |
否 |
no |
yes/no |
是否覆盖 |
others |
否 |
- |
- |
文件模块参数 |
src |
否 |
- |
- |
复制的源文件 |
validate |
否 |
- |
- |
复制前是否检验需要复制目的地的路径 |
3、文件拉取模块——fetch
Ø 将远端主机的/etc/salt/minion文件收集回服务器/root/demo目录下
ansible all –m fetch –a “dest=/root/demo src=/etc/salt/minion “
fetch模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
dest |
是 |
- |
- |
文件存放路径,假如存放路径是/backup,复制的源文件为/etc/profile,目标主机名是host,那么会被存为下/backup /host/etc/profile |
fail_on_running |
否 |
no |
yes/no |
假如找不到目标文件则被标记为失败 |
flate |
否 |
- |
- |
用于覆盖原有的dest存放规则 |
validate_md5 |
否 |
no |
yes/no |
是否用md5进行文件的校验 |
src |
是 |
- |
- |
目标文件路径 |
4、文件管理模块——file
Ø 删除所有服务器下的/root/copydemo.txt 文件
ansible all –m file –a “path=/root/copydemo.txt state=absent “
file模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
force |
否 |
no |
yes/no |
是否覆盖原有文件 |
group |
否 |
- |
- |
文件属于的用户组 |
mode |
否 |
- |
- |
文件的读/写权限 |
owner |
否 |
- |
- |
文件的属于的用户 |
path |
是 |
- |
- |
文件路径 |
recurse |
否 |
no |
yes/no |
是否递归设置属性 |
selevel |
否 |
s0 |
- |
selinux的级别 |
serole |
否 |
- |
- |
selinux角色 |
setype |
否 |
- |
- |
selinux类型 |
secuser |
否 |
- |
- |
selinux用户 |
src |
否 |
- |
- |
文件链接路径 |
state |
否 |
file |
file link directory hard touch absent |
如果是directory,那么则会创建文件夹 如果是file,则会创建文件 如果是link,则会创建链接 如果是hard,则会创建硬链接 如果是touch,则会创建文件 如果是absent,则会删除文件 |
5、ini文件管理模块
ini文件是十分常见的一种配置文件,ansible内置了ini配置文件的管理模块,用于对文件进行配置项的管理。
Ø 修改配置文件/root/demo.ini,selection为cron的选项组的crontime选项,把cron的值修改为10。
ansible all –m ini_file –a “dest=/root/demo.ini section=cron option=crontime value=10”
ini模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
backup |
否 |
no |
yes/no |
是否创建备份文件 |
dest |
是 |
- |
- |
ini文件路径 |
option |
否 |
- |
- |
ini文件的键选项 |
others |
否 |
- |
- |
文件模块的其他参数 |
section |
是 |
- |
- |
选中ini的变量名 |
value |
否 |
- |
- |
ini变量的值 |
二、命令执行模块
1、命令执行模块——command
command模块用于在给定的主机上执行命令。值得留意的时,command模块执行的命令是获取不到$HOME这样的环境变量的,一些运算符,例如”<“ 、”>“ 在command模块上也是不能使用的。
command模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
chdir |
否 |
- |
- |
执行命令前先进入到某个目录 |
creates |
否 |
- |
- |
一个文件名,假如文件名已经存在,则不会运行此步骤 |
executable |
否 |
- |
- |
改变执行命令所有的shell |
free_form |
是 |
- |
- |
需要执行的指令 |
removes |
否 |
- |
- |
一个文件名,假如不存在该文件,则此步骤不会被执行 |
2、command模块的增强版——shell
command模块是不支持运算符的,同时也不支持管道这样的操作。我们使用command模块可以尝试执行一下检查mysql进程是否存在。
ansible all –m command –a “ps –ef | grep mysql”
执行完后,ansible会发出不支持操作符的提示,而shell模块是专门解决这种问题的,它支持管道操作符,可以看做command模块的增强版,可以使用如下方式对mysql进程进行检查就可以得到正确的结果。
ansible all –m shell –a “ps –ef | grep mysql”
shell模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
chdir |
否 |
- |
- |
执行命令前先进入到某个目录 |
creates |
否 |
- |
- |
一个文件名,假如文件名已经存在,则不会运行此步骤 |
free_form |
是 |
- |
- |
需要执行的指令 |
removes |
否 |
- |
- |
一个文件名,假如不存在该文件,则此步骤不会被执行 |
3、脚本执行模块——script
很多时候执行单条命令并不能满足我们的要求,我们需要在目标主机上执行一系列的命令,这种情况下可以考虑把多条命令写成脚本,然后通过ansible的文件管理模块把脚本下发到目标机器上;接着再用script模块运行脚本的执行,得到所期望的结果。需要注意的是执行的脚本是管理主机上存在的脚本。
例如我们有一个巡检脚本,已经通过copy模块把脚本下发到主机上,并且用file模块完成了脚本文件的授权,脚本test.sh内容如下:
$system_uptime >> $path
echo –e 1分钟/5分钟/15分钟平均负载/在采样的时刻,运行任务的数目/系统活跃任务的个数/最大的pid值线程/“/t” $system_uptime >> $path
可以看到整份甲苯的命令数量是比较多的,采用shell模块或command命令都无法很好地完成这个巡检任务。这时可以用script模块完成主机的批量巡检。
ansible all –m script –a ‘/root/demo/test.sh’
script模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
free_form |
是 |
- |
- |
需要执行的脚本 |
4、ssh命令执行模块——raw
ansible虽然不需要安装客户端,但是内置的模块大多需要客户机上有python环境或者具备某些python扩展才能够执行。假设我们管理的设备上没有python环境,ansible的很多模块都用不了,但是又想执行一些简单的命令,怎么办呢?这时候可以时候raw模块,这个模块是直接通过ssh方式而不是通过python的方式去对主机进行操作的。
例子: ansible all –m ssh –a ‘ip a’
raw模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
executable |
否 |
- |
- |
改变执行命令所用的shell |
free_form |
是 |
- |
- |
需要执行的指令 |
三、网络相关模块
1、下载模块——get_url
get_url模块用于下载网络上的文件
Ø 例:下载百度的首页
ansible all –m get_url –a ‘dest=/root url=http://www.baidu.com’
get_url模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
dest |
是 |
- |
- |
文件下载路径 |
force |
否 |
no |
yes/no |
是否覆盖 |
others |
否 |
- |
- |
文件模块的其他参数 |
sha256sum |
否 |
- |
- |
是否采用SHA-256校验 |
url |
是 |
- |
- |
下载文件的目标路径 |
use_proxy |
否 |
no |
yes/no |
是否使用代理 |
2、Web请求模块——uri
uri模块主要用于发送HTTP协议,通过使用uri模块,可以让目标主机向指定的网站发送如Get、Post这样的HTTP请求,并且能得到返回的状态码。
uri模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
HEADER_ |
否 |
- |
- |
HTTP头 |
Body |
否 |
- |
- |
HTTP消息体 |
Creates |
否 |
- |
- |
文件名称 |
Dest |
否 |
- |
- |
文件下载路径 |
follow_redirects |
否 |
no |
yes/no |
URI模块是够应该遵循所有的重定向 |
force_basic_auth |
否 |
no |
yes/no |
强制在发送请求前发出身份验证 |
method |
否 |
GET |
GET POST PUT HEAD DELETE OPTIONS |
HTTP方法 |
others |
否 |
- |
- |
文件模块参数 |
password |
否 |
- |
- |
密码 |
removes |
否 |
- |
- |
需要删除的文件名称 |
return_content |
否 |
no |
yes/no |
返回内容 |
status_code |
否 |
200 |
- |
状态码 |
timeout |
否 |
30 |
- |
超时时间 |
url |
是 |
- |
- |
url地址 |
use |
否 |
- |
- |
用户名 |
四、包管理模块
1、包管理模块--YUM
例:使用yum模块安装最新的httpd
yum:name=httpd state=latest
YUM模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
conf_file |
否 |
- |
- |
YUM配置文件 |
disable_gpg_check |
否 |
no |
yes/no |
是否开启GPG仓库 |
disablerepo |
否 |
- |
- |
禁用的仓库 |
enablerepo |
否 |
- |
- |
启用的仓库 |
name |
是 |
- |
- |
包名 |
state |
否 |
present |
present latest absent |
安装、更新、卸载软件 |
六、系统管理模块
1、作业管理模块——cron
在Liunx服务器中,定时任务一般由cron来承担。
在用户建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,分时日月周[指令]
minute hour day month week command
例:每天8点钟进行MYSQL数据库备份
ansible all –m cron –a ‘name=demo hour=8 job=mysqldump –uroot –pxxx demo> demo.sql’
cron模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
backup |
否 |
- |
- |
修改前是否备份 |
cron_file |
否 |
- |
- |
cron定义文件,指定了则读这份,不会读用户的cron.d文件 |
day |
否 |
* |
- |
天 |
hour |
否 |
* |
- |
小时 |
minute |
否 |
* |
- |
分钟 |
month |
|
|
|
月 |
weekday |
否 |
* |
- |
星期几 |
job |
否 |
- |
- |
执行的命令 |
name |
否 |
- |
- |
作业的描述 |
reboot |
否 |
no |
yes/no |
重启后是否需要执行 |
special_time |
否 |
- |
reboot yearly annually monthly weekly daily hourly |
特定的执行时间 |
state |
否 |
present |
present absent |
启用或停止作业 |
user |
否 |
root |
- |
执行作业的用户 |
2、用户管理模块——group
使用group可以对主机进行批量的用户组添加或删除
例:为主机批量添加zabbix用户组
ansible all –m group –a ‘name=zabbix state=present’
group模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
gid |
否 |
- |
- |
用户的GID |
name |
是 |
- |
- |
用户组的名字 |
state |
否 |
present |
present absent |
新增/删除 |
system |
否 |
no |
yes/no |
是否是系统组 |
3、服务管理模块——service
例:批量重启httpd服务
ansible all –m service –a ‘name=httpd state=restarted’
service模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
arguments |
否 |
- |
- |
参数 |
enable |
否 |
- |
yes/no |
开机自启动 |
name |
是 |
- |
- |
服务名称 |
pattern |
否 |
- |
- |
如果服务没响应,则ps查看是否有指定参数的进程,有则认为服务已经启动 |
runlevel |
否 |
default |
- |
OpenRC init脚本 |
sleep |
否 |
- |
- |
如果服务被重新启动,则睡眠很多次后再执行停止和启动命令 |
state |
否 |
- |
started stopped restarted reloaded |
服务的状态 |
4、用户管理模块——user
Ø 例:移除所有主机上的zabbix用户
ansible all –m user –a ‘name=zabbix state=absent remove=yes’
user模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
append |
否 |
- |
- |
增加到组 |
comment |
否 |
no |
yes/no |
可选设置用户账号的描述 |
createhome |
否 |
no |
yes/no |
是否创建home目录 |
force |
否 |
no |
yes/no |
是否强制操作 |
generate_ssh_key |
否 |
- |
- |
是否生成ssh秘钥 |
group |
否 |
- |
- |
用户组 |
groups |
否 |
- |
- |
以逗号分隔的用户组 |
home |
否 |
- |
- |
home目录 |
login_class |
否 |
- |
- |
可以设置用户的登录类FreeBSD、OpenBSD和NetBSD |
name |
是 |
- |
- |
用户名 |
non_unique |
否 |
no |
yes/no |
相当于useradd –u |
password |
否 |
- |
- |
密码 |
remove |
否 |
no |
yes/no |
相当于userdel -remove |
shell |
否 |
- |
- |
该用户的shell |
ssh_key_bits |
否 |
2048 |
- |
密钥的位数 |
ssh_key_comment |
否 |
ansible_generated |
- |
密钥的说明 |
ssh_key_file |
否 |
$HOME/.ssh/id_rsa |
- |
密钥的文件名 |
ssh_key_passphrase |
否 |
- |
- |
ssh密钥的密码 |
ssh_key_type |
否 |
rsa |
- |
ssh密钥的类型 |
state |
否 |
present |
present absent |
新增/删除 |
system |
否 |
no |
yes/no |
设置为系统账号 |
uid |
否 |
- |
- |
用户的UID |
update_password |
否 |
always |
always on_create |
是否需要更新密码 |
5、系统信息模块——setup
Ø 例:获取所有的信息
ansible all –m setup
setup模块参数及说明
参数 |
必填 |
默认值 |
选项 |
说明 |
fact_path |
否 |
/etc/ansible/facts.d |
- |
fact的路径 |
filter |
否 |
* |
- |
过滤窜 |