admin管理员组文章数量:1566356
ansible使用
- ansible发展史
- 特性
- ansible的命令执行过程:
- ansible的主要组成部分
- ansible主要组成部分
- ansible的安装
- ansible配置文件
- 主机清单inventory、/etc/ansible/hosts
- ansible的配置文件/etc/ansible/ansible.cfg
- ansible系列命令,执行临时命令
- ansible常见模块介绍:
- ansible-galaxy
- ansible-playbook:执行playbook
- ansible-valut
- ansible-console
- Playbook:剧本
- 示例
- handlers和notify结合使用触发条件
- tags:标签
ansible发展史
创始人:Michael DeHaan(cobbler和func的作者)func也是一个自动化运维工具
2012-03-09发布0.0.1版本,被红帽收购
2015-10-17,红帽被IBM收购
特性
模块化:调用特定的模块,完成特定的任务
有Paramiko(Python开发的模块),PyYAML(一门语言),Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于Python和SSH服务,agentless(无代理,不需要安装代理软件),走的是ssh,而ssh服务器默认安装好的
安全,基于OpenSSH协议
支持playbook编排任务,剧本的意思。相当于shell的脚本,集中命令
幂等性:一个任务执行1遍和执行n遍效果一样,不会重复执行带来意外情况
无需代理不依赖PKI证书(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
ansible不是一个服务软件,只是一个管理工具
ansible的命令执行过程:
1.加载自己的配置文件,默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command,默认模块可在配置文件中自定义
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程主机的对应执行用户¥HOME/.absible/tmp/ansible-tmp-数字.py文件
4.给文件+x执行执行
5.执行并返回结果
6.删除临时py文件
7.退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
蓝色:执行过程,使用-v -vv -vvv,v越多,显示的信息越详细
ansible的主要组成部分
ANSBLE PLAYBOOKS:任务剧本(任务集),编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:ansible管理主机的清单/etc/anslble/hosts文件
MODULES:ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSBLE:组合INVENRORY,API,MODULES,PLUGINS的绿框,可以理解为是ansible的命令工具,其为核心执行工具
ansible主要组成部分
ansible命令执行来源
USER,普通用户,即system administrator
CMDB(配置管理数据库)API调用
PUBLIC/PRIVATE CLOUD API调用
USER -> Ansible playbook -> ansible
利用ansible实现管理的方式
Ad-Hoc 即ansible命令,主要用于临时命令使用场景
ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
ansible-playbook(剧本)执行过程
将已有编排好的任务写入ansible-playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
ansible主要操作对象
hosts主机
networking网络设备
注意事项
执行ansible的主机一般为主控端,中控,master或堡垒机
主控端Python版本需要2.6以上
被控端Python版本小于2.4需要安装Python-simplejson
被控端如开启selinux需要安装libselinux-python
windows不能做主控端
absible不是一个服务,没有service文件,只是管理时执行下然后就退出了,不需要长时间运行
ansible的安装
rpm包安装:EPEL源
yum -y install ansible
安装时如果出现依赖Python某些包,是因为版本不兼容,centos7的镜像中的版本过新,挂载一个centos6的镜像盘,并更新yum源,接着安装以下包
yum install python-simplejson python-babel PyYAML python-six python-pyasn1 python-markupsafe
安装完成后再接着安装ansible
编译安装
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
确认安装:
ansible --version
ansible配置文件
/etc/ansible/absible.cfg :主配置文件,配置ansible工作特性
/etc/ansible/hosts :主机清单,在此文件中是被控制的主机IP
/etc/ansible/roles :存放角色的目录
程序:
/usr/bin/ansible :主程序,临时命令执行工具
/usr/bin/ansible-doc :查看配置文件,模块功能查看工具
/usr/bin/ansible-galaxy :下载/上传优秀代码或roles模块的官网平台
/usr/bin/ansible-playbook :定制自动化任务,编排剧本工具/usr/bin/ansible-pull远程执行命令的工具
/usr/bin/ansible-valut :文件加密工具
/usr/bin/ansible-console :基于console界面与用户交互的执行工具
主机清单inventory、/etc/ansible/hosts
ansible的主要功能在于批量主机操作,为了便捷的使用其中的部分主机。可在inventory file中将其分组命名
默认的inventory file为/etc/ansible/hosts
inventory file可以有多个。也可以通过dynamic inventory来动态生成
想要管理主机必须将被管理主机的IP地址放在/etc/ansible/hosts此文件中
文件中有示例,可根据示例自定义管理单台主机,或分组管理主机
/etc/ansible/hosts文件的格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一主机归并再多个不同的组中。
此外当如若目标主机使用了非默认的SSH端口,还可以在主机名称后使用冒号加端口来表明
例:可使用主机名或IP地址
www.linux
[webserver]
www1.linux:2222 | 192.168.0.130:2222
www2.linux
[dnserver]
db1.linux
db2.linux
db3.linux
如果主机名遵循相似的命名风格,还可以使用列表方式表示个主机
[webserver]
www[01:100].example :表示www01,02,..100.example
[dbserver]
db-[a:f].example :表示db-a,b,c..f.example
ansible的配置文件/etc/ansible/ansible.cfg
一般保持默认
[default]
inventory = /etc/ansible/hosts #被控端主机清单文件
library = /usr/share/my_modules/ #指定ansible搜索模块位置,如果需要自定ansible模块,需要放到 library 所指定的目录下
remote_tmp = ~/.ansible/tmp #临时文件远程主机存放目录
临时py命令文件存放在远程主机目录,将执行的ansible命令转换成Python文件,然后复制到远程管理主机上。在远程主机上执行一遍,执行完毕后会自动删除
local_tmp = ~/.ansible/tmp #临时文件本地主机存放目录
forks = 5 #ansible在执行工作时进程数量
poll_interval = 15 #默认轮询间隔时间,单位秒
sudo_user = root #被控端默认执行sudo命令所切换的用户
ask_sudo_pass = True #每次执行sudo命令时是否询问sudo到目标用户的密码
ask_pass = True #每次执行ansible命令是否询问ssh密码
transport = smart #通信机制,传输时用的协议
remote_port = 22 #远程连接被控端的ssh端口
module_lang = C #模块和系统之间通信的语言,默认为C语言
gathering = implicit #控制默认facts收集,远程系统变量
roles_path = /etc/ansible/roles #角色存储路径
host_key_checking = False #是否检查远程主机密钥
sudo_exe = sudo #sudo远程执行命令
sudo_flags = -H -S -n #传递sudo之外的参数
timeout = 10 #SSH超时时间
remote_user = root #指定默认的远程连接用户
log_path = /var/log/ansible.log #ansible日志文件,执行ansible的用户需要对日志文件具有写入权限,建议取消注释启用,记录日志有利于排错
module_name = command #ansible默认执行的模块
executable = /bin/sh #执行的shell环境,用户shell模块
hash_behaviour = replace #如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
private_role_vars = yes #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
private_key_file = /path/to/file #私钥文件存储位置
command_warnings = False #command模块Ansible默认发出警告
nocolor = 1 #ansible输出带上颜色区别,0表示开启,1表示关闭
pipelining = False #开启pipe ssh通道优化
[inventory]
[privilege_escalation]
#出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置
become=True #是否sudo
become_method=sudo #sudo方式
become_user=root #sudo后变为root用户
become_ask_pass=False #sudo后是否需要验证密码
[paramiko_connection]
pty=False #是否禁用sudo功能
[ssh_connection]
#Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s #ssh连接时的参数
pipelining = False #SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项
scp_if_ssh = smart #该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为smart,smart为先尝试sftp,然后尝试scp
[persistent_connection] #持续连接
connect_timeout = 30 #ansible如果在30秒内没有收到请求,则关闭连接,默认为30秒
command_timeout = 30 #ansible执行命令如果在30秒内没有收到回应则认为命令超时
[accelerate] #缓存加速
accelerate_port = 5099 #加速连接端口5099
accelerate_timeout = 30 #命令执行超时时间
ccelerate_connect_timeout = 5.0 #连接超时时间,单位为秒
accelerate_daemon_timeout = 30 #上一个活动连接的时间,单位为分钟
accelerate_multi_key = yes #允许多个私钥被加载到daemon
[selinux]
special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p #文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
libvirt_lxc_noseclabel = yes #将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作
[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
highlight = white
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines = cyan
[diff]
always = no
context = 3
ansible系列命令,执行临时命令
ansible显示模块帮助
ansible-doc [option] [mudule]
-a :显示所有模块的文档
-l :列出可用模块
-s :显示指定模块的playbook片段
示例:
ansible-doc -l :列出所有模块
ansible-doc ping :查看指定模块帮助用法
ansible-doc -s ping :简要查看指定模块的帮助用法
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于ssh-key验证的方式连接各个被管理服务器
基本用法:
ansible <host-pattern> [-m modules_name] [-a]:-a是模块的参数,例如ls是模块,ls自身有很多参数,ansible的模块参数需要-a指定
--version:显示版本
-m modules:指定模块,ansible配置文件中默认模块为command
需要修改/etc/ansible/ansible.cfg找到#module_name = command,修改即可
-v:详细过程-vv -vvv更详细
--list:显示主机列表
-k:提示输入ssh连接密码,默认为key验证
-K:提示输入sudo时的口令
-C:检查,但不执行
-T:执行命令的超时时长,默认10s
-u user:执行远程执行的用户
-b:代替旧版的sudo 切换
--become-user=username:指定sudo的runas用户,默认为root
ansible的host-pattern:匹配主机的列表有以下几种方式
all:标识所有在/etc/ansible/hosts文件中定义的主机
*:通配符
ansible "*" -m ping :所有主机
ansible "192.168.40.*" -m ping :40网段的主机
ansible "*server" -m ping :ping所有组名为server结尾的组
或关系:
ansible "webserver:appserver" -m ping :两个组内的所有主机
ansible "192.168.40.140:192.168.40.139" -m ping :PING两个主机
与关系:
ansible "webserver:&appserver" -m ping :某一个主机IP在webserver并且同时也在appserver组中
非关系:
ansible 'webserver:!appserver' --list :表示在webserver组中,但是不在appserver组中
注意:此处是单引号
正则表达式:
ansible "~(web|app).*\.magedu\" -m ping
注意:使用正则表达式前面必须有 ~ 符号,. 需要转义
ansible的命令执行过程:
1.加载自己的配置文件,默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程主机的对应执行用户¥HOME/.absible/tmp/ansible-tmp-数字.py文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,sleep 0退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
蓝色:执行过程
ansible常见模块介绍:
ansible-doc -s mudules_name :查看模块帮助
ansible-doc -s shell command script :这三个模块里面都有以下子命令
chdir:在远程主机上切换目录,相当于本机的cd命令
例:ansible all -a 'chdir=/data touch file1' :先进入到data目录,然后touch文件
ansible all -a 'chdir=/data/ ls' :查看
creates:如果远程主机上文件存在,则此命令不执行
例:ansible all -a 'creates=/etc/fstab rm -f /data/*' :/etc/fstab文件存在。所以后面的命令不执行
ansible all -a ' ls /data/' :查看
removes:如果远程主机上文件不存在,则此命令不执行
例:ansible all -a 'removes=/etc/fstab rm -f /data/*' :如果/etc/fstab文件存在,后面的命令执行
ping模块是个小模块,只是用来测试主机之间是否连通,绿色为通,红色为不通
示例:
ansible all -m ping :all是所有在hosts文件中的主机
ansible webserver -m ping :所有在webserver组的主机
ansible 192.168.40.140 -m ping :单个主机
command:在远程主机执行命令,默认模块,编写命令时可忽略 -m 选项
示例:
ansible webserver -m command -a 'useradd cheng' :创建用户
ansible webserver -m command -a 'getent passwd cheng' :查看是否创建成功
ansible webserver -a 'getent passwd cheng' :一样的效果,command是默认模块,可省略-m选项
ansible webserver -a 'echo 123123|passwd --stdin cheng'
此命令不支持变量,管道等,输出只是打印了一遍123123|passwd --stdin cheng,用shell模块支持简单变量等
shell:和command相似,用shell执行命令,如果不想每次-m shell指定,可直接修改配置文件ansible.cfg,找到默认模块那一行改为shell
ansible webserver -m shell -a 'echo 123123|passwd --stdin cheng' :修改cheng用户密码
调用bash执行命令。类似cat /tmp/stanley.md|awk -F '|' '{print $1,$2}' &> /tmp/example.txt这些复杂命令即使使用shell模块也可能会失败,解决办法,写到脚本里,
copy到远程。执行,再把需要的结果拉回执行命令的设备
script:在远程主机上运行ansible服务器上的脚本
-a "/path/to/script_file"
ansible webserver -m script -a /data/ping.sh
示例:编写脚本test.sh
#!/bin/bash
hostname
sed -i 's#^SELINUX=.*#SELINUX=AAA#' /etc/selinux/config
ansible all -m script -a '/root/test.sh' :复制过去执行并返回结果
ansible all -a 'grep "^SELINUX" /etc/selinux/config' :查看
copy:从服务器复制文件到客户端
ansible-doc -s copy
src=:源文件,也就是ansible主机的文件,全部使用=号赋值
dest=:目标文件,被ansible管理的主机
backup=:如果目标有同名文件,会先将目标文件备份,然后在copy过去
owner=:指定所属主
group=:指定所属组
mode=:指定权限
示例:
ansible all -m copy -a 'src=/etc/fstab dest=/data/ mode=600' :将本机fstab文件复制到被管理主机上/data/目录下并修改文件权限
ansible all -a 'ls -l /data/fstab' :查看,注意这里不支持使用ll
ansible all -m copy -a 'src=/etc/issue dest=/data/fstab backup=yes'
再次复制时有backup选项,它会先将原有的fstab文件备份,接着在copy,备份文件名格式:fstab.4020.2019-10-11@20:44:03~
ansible all -m copy -a 'src=/data/bin dest=/data/' :将/data/bin目录copy到远程主机
ansible all -m copy -a 'src=/data/bin/ dest=/data/' :/data/bin/加斜线表示bin目录下文件copy到远程主机,注意区分
fetch:从客户端取文件至服务器端,和copy相反
注意:如果取目录需要先将目录使用tar压缩,不支持直接取目录
ansible-doc -s fetch
dest:这里的目标是本机的某个目录,因为是从远程主机抓取到本机,所以dest是本机目录
src:这里的源文件反而成了远程主机上的文件,只能抓取文件,不能抓取目录,遥想抓取目录将目录打包
示例:
ansible all -m fetch -a 'src=/data/file1 dest=/mnt/'
从远程主机data目录下复制file1文件到本机的mnt目录下。/mnt目录下会创建以远程主机IP命名的目录,目录下就是复制过来的内容
ansible all -a 'tar cf /root/data.tar /data/' :将远程主机上的data目录打包成tar文件
ansible all -m fetch -a 'src=/root/data.tar dest=/data/':再将打包文件取到本机data目录下
file:设置文件属性
ansible-doc -s file
owner:设置文件所属主
group:设置文件所属组
mode:设置文件权限
src:源文件,主要是配合link,为哪个文件创建链接
state=:touch创建、absent删除文件、link创建软链接、hard创建硬链接、directory创建目录
path:将来管理的文件路径,要写清,dest,name和path同义
示例:
ansible all -m file -a 'path=/data/file.txt state=touch mode=000' :创建文件并设置属性,前提要指明在哪个路径下创建
ansible all -a 'ls -l /data/file.txt' :查看
ansible all -m file -a 'path=/data/file1 state=absent' :absent删除file1文件
ansible all -m file -a 'src=/data/bin path=/root/bin.link state=link'
为bin目录创建链接,src指明为bin,path是指明创建后的路径,link创建软连接
ansible all -m file -a 'src=/data/file.txt path=/root/file.link state=hard' :创建硬链接
ansible all -m file -a 'path=/data/haha state=directory' :创建一个目录
ansible all -m file -a 'path=/data/haha state=absent' :删除目录,删文件也相同
hostname:管理主机名
ansible-doc -s hostname
name=:后面跟替换的主机名即可
示例:
ansible 192.168.40.139 -m hostname -a 'name=centos6_2'
修改主机名,主机名文件也会修改
cron:计划任务
ansible-doc -s cron
month:月
weekday:周0,6
day:天
hour:时
minute:分
reboot:重启后执行的任务计划
job:要执行的命令
name:为计划任务去个名称
state:absent删除任务计划
disabled:禁用cron任务
示例:
ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall ha ha ha!!!" name=wall'
创建任务,每5分钟并且在周六日执行wall hahaha命令。注意是命令的绝对路径,然后为任务创建了命令叫wall
ansible all -a 'crontab -l' :查看计划任务
#Ansible: wall :名字
*/5 * * * 0,6 /usr/bin/wall ha ha ha!!!
ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall ha ha ha!!!" name=wall disabled=yes'
禁用cron任务,要明确写明为那一条任务禁用,要启用将disabled=no就可以了
ansible all -m cron -a 'name=wall state=absent' :删除计划任务给出任务名即可,前提是创建任务时有名字
yum:管理包,必须是使用yum管理包的系统才行
ansible-doc -s yum
list:
name=:给出要安装的软件名,安装时多个软件名使用逗号隔开
state=:`present' or `installed'是安装包,`absent' or `removed'是删除包
示例:
ansible all -m yum -a 'name=vsftpd state=installed':可省略state=installed,因为默认就是安装包
在安装时确认yum源,我在使用此条名命令时,centos6主机上的yum源有centos7的镜像源,执行此命令时,却升级了bash,glibc等包,导致centos6无法使用,后来在centos6主机上将centos7yum源清除,安装正常,注意,不过此条命令不常用
ansible all -m yum -a 'name=httpd,dhcp state=installed' :安装多个时,使用逗号隔开
ansible all -m yum -a 'name=httpd,dhcp state=absent' :卸载包
ansible all -m yum -a 'name=vsftpd state=absent' :卸载包
service:管理服务
大家知道centos6和centos7管理服务的方式不同,但是在ansible中全部统一,由service模块管理即可
ansible-doc -s service
enabled:yes是开机自启动
name:给出服务名
state:started'/`stopped,`restarted',`reloaded'
示例:
ansible all -m service -a 'name=vsftpd state=started enabled=yes' :启动vsftpd服务并设置为开机自启动
ansible all -a 'ss -nltup' :查看端口是否开启
ansible all -m service -a 'name=vsftpd state=stopped' :停止服务
ansible all -m service -a 'name=vsftpd state=restarted' :重启
ansible all -m service -a 'name=vsftpd state=reloaded' :重新加载配置文件
user:管理用户
ansible-doc -s user
append:yes加入到附加组
group:指定主组
groups:指定附加组
home:指定家目录
name:指定用户名。用于创建,删除,修改
password:指定用户密码,是加密后的密码,可使用openssl passwd -1输入两遍密码后然后复制到ansible命令中
remove:=yes删除家目录
shell:指定用户shell
state:absent删除用户,但是不删除用户家目录
system:指定为系统用户
示例:
ansible all -m user -a 'name=cheng password=123123 groups=root' :创建用户并指定密码和附加组
ansible all -a 'id cheng' :查看
ansible all -m user -a 'name=test home=/data/testhome shell=/sbin/nologin groups=cheng'
创建test用户。home为/data/testhome,shell为/sbin/nologin groups为cheng
ansible all -m user -a 'name=test state=absent remove=yes':删除用户并删除家目录
group:管理组
ansible-doc -s group
state:absent删除组
system:系统组
name:指定组名
示例:
ansible all -m group -a 'name=testgroup state=present' :创建一个组
ansible all -m group -a 'name=testgroup state=absent' :删除一个组
ansible-galaxy
连接htpps://galaxy.ansible下载响应的roles(角色)
htpps://galaxy.ansible :此网站是个开源网站,里面存放的是各个大牛自己写的playbook,然后上传到此网站,各种项目的,可下载修改
roles角色的理解:将多个脚本存放在一个目录结构中,我们下载时将整个目录下载,其中包括好多playbook(剧本。脚本)
示例:
ansible-galaxy list :列出所有已安装的Galaxy
ansible-galaxy install geerlingguy.redis :下载role角色
cp -r /root/.ansible/roles/geerlingguy.redis/ /root/.ansible/roles/test.redis
可以复制一份当作自己的role,然后进行修改
ansible-galaxy remove geerlingguy.redis :删除role角色
ansible-playbook:执行playbook
示例:ansible-playbook hello.yml
cat hello.yml
#hello world yml file
- hosts:webserver
remote_user:root
tasks:
- name:hello world
command:/usr/bin/wall hello world
注意:格式必须对其
ansible-valut
功能:管理、加密和解密yml文件,用的不多,了解一下
示例:
ansible-valut encrypt hello.yml :加密
ansible-valut decrypt hello.yml :解密
ansible-valut view hello.yml :查看
ansible-valut edit hello.yml :编辑加密文件
ansible-valut rekey hello.yml :修改口令
ansible-valut create hello.yml 创建新文件
ansible-console
2.0新增,可交互执行命令,支持tab补全,用的不是特别多,但是要知道,使用与测试用
root@test(2)[f:10]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
设置并发数:forks N 例如:forks 10
切换组:cd 主机组 例如:cd webserver
列出当前组主机列表:list
列出所有内置命令:?或help
示例:
[root@centos7_1 ~]#ansible-console 直接回车
Welcome to the ansible console.
Type help or ? to list commands.
root@all (3)[f:5]$ list
192.168.40.139
192.168.40.140
192.168.40.142
root@all (3)[f:5]$ cd webserver :切换组
root@webserver (2)[f:5]$ forks 10 :修改并发数
root@webserver (2)[f:10]$ list
192.168.40.142
192.168.40.139
root@webserver (2)[f:10]$ file :tab键补全查看
file files filesystem
root@webserver (2)[f:10]$ file dest=/data/ansible.txt state=touch :可直接使用file模块进行创建文件
root@webserver (2)[f:10]$ shell ls /data/ -l :使用shell模块调用shell命令查看
Playbook:剧本
是由一个或多个"play"组成的列表
play的主要功能在于将预定义的一组主机,装扮成实现通过ansible中的task定义好的角色。task实际是调用ansible的一个模块,将多个paly组织在一个playbook中,即可以让他们联合起来,按时限编排的机制执行预定义的动作
playbook采用YAML语言编写
YAML介绍
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,摆阔XML,C,Python等
特性:
可读性好
和脚本语言的交互性好
使用实现预言的数据类型
有一个一致的信息模型
易于实现
可以基于流来处理
表达能力强,扩展性好
官网地址:http://www.yaml :网站中定义了YAML在各种语言中书写的格式
YAML语法简介
在单一文件中,可用连续三个 - (减号)区分多个文件段,另外,还有选择性的连续三个 . 用来表示档案结尾
慈航开始正常写playbook的内容,一般建议写明该playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用,缩进用两个空格
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容是区别大小写的,key/value的值均需大小写敏感
key/value的值可同行写也可换行写,同行使用:分隔
value可是个字符串,也可是一个列表
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
list:列表,其所有元素均使用"-" 打头,注意-后面有一个空格
字典:通常由多个key与value构成
示例:
name: create user
tasks: name=vsftpd
也可以将key:value放于{}花括号中表示,用逗号分隔开
{name: create user,tasks: name=vsftpd}
Playbook核心元素:
hosts:执行的远程主机列表
tasks:任务集
varniables:内置变量或自定义变量在playbook中调用
template:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
handlers和notify:结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码,ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常的长,此时,如果确信其没有变化,就可以通过tags跳过这些代码片段
例:ansible-playbook -t tagsname useradd.yml
hosts:
playbook中的每一个play的目的都是为了让特定主机以某个特定的用户身份执行任务,hosts用于指定要执行指定任务的主机,须事先定义在=主机清单中
可以是以下形式:
www.cheng
www.cheng:www.ning
192.168.40.5
192.168.40.*
webserver:appserver :或关系。两个组的并集
webserver:&appserver :与,两个组的交集
webserver:!appserver :在webserver组,但不在APPserver组
remote_user:
远程时执行命令的用户,可用于host和task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务。
此外,甚至可以在sudo时使用sudo_user指定sudo时切换身份的用户
- hosts: wenserver
remote_user
tasks:
- name: test connect :任务名称
ping: :模块
remote_user: ning :执行命令的用户身份
sudo: yes :默认sudo用户为root
sudo_user: cheng :让ning用户使用cheng用户sudo权限执行此模块中定义的命令,前提是在远程主机上,sudo配置文件中cheng用户是否为ning用户授权了sudo权限
task列表和action:
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行时幂等的。这意味着多次执行是安全的,因为其结果是一致的
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰的描述任务执行步骤,如果为提供name,则action的结果将用于输出
tasks任务列表
两种格式:
1.action: module_name arg :action后跟模块名和模块的参数用的不多
2.module_name: arg :直接模块名后面分参数,建议使用,常用
注意:shell和command模块后面跟命令,而非key=value 某任务的状态在运行后为changed时,可用过"notify"通知给相应handle
任务可以通过"tags"打标签。可在ansible-playbook命令上使用-t指定进行调用
例:
tasks:
- name: disable selinux
shell: /sbin/setenforce 0
如果命令或脚本的退出码不为0,使用场景为当你认为某个错误信息,不是什么大问题,但是它提示错误时,可以使用如下方式代替:
tasks:
- name: run this cammand and ignore the result
shlle: /usr/bin/aaabbb || /bin/true :显然是没有aaabbb这样的命令的,肯定会报错,使用短路或执行后面的命令/bin/true,这样就不会报错了
运行playbook的方式
ansible-playbook <filename.yml> [option]
常见选项:
-C:只检测可能会发生的改变,但不是真正的运行这个剧本
--list-hosts:列出运行任务的主机
--list-tags:列出标签
--list-tasks:列出任务
--limit 主机列表:只针对主机列表中的主机执行
例:ansible-playbook test.yml --limit 192.168.40.140 :只针对40.140这台主机执行
-v -vv -vvv:显示过程
示例测试文件:cat test.yml
---
- hosts: appserver
remote_user: root
tasks:
- name: test connect
ping:
- name: display hostname
shell: /usr/bin/hostname
playbook检查:
ansible-playbook -C test.yml
执行:
ansible-playbook test.yml -v :-v详细信息,-vv,-vvv
示例
1、使用ansible在多台主机上添加用户,前提是已经经过SSH key验证
ansible all -m user -a 'name=test home=/data/test shell=/sbin/nologin group=root uid=9527'
2、使用playbook创建nginx用户并指定属性。安装nginx包,将本地编辑好的nginx配置文件复制给远程主机,并启动服务,设置为开机自启
vim install_nginx.yml
---
- hosts: appserver
remote_user: root
tasks:
- name: create group
group: name=nginx system=yes gid=80
- name: create user
user: name=nginx home=/data/nginx group=nginx shell=/sbin/nologin uid=80 password='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfgirYaeNOZQWmVGD9o/2Bj3n2fCS/'
- name: install nginx
yum: name=nginx
- name: copy config_file
copy: src=/root/playbook/nginx.conf dest=/etc/nginx/ backup=yes
- name: start nginx service
service: name=nginx state=started enabled=yes
使用Python生成sha512算法密码:注意,每次虽然是相同的密码,但是得出加密后的字符并不相同
python -c 'import crypt,getpass;pw="123123";print(crypt.crypt(pw))
$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfgirYaeNOZQWmVGD9o/2Bj3n2fCS/
检查语法:
ansible-playbook -C install_nginx.yml
执行此playbook
ansible-playbook install_nginx.yml
验证:
ansible appserver -a 'ss -nlt' :验证端口是否开启,是否为自定义端口,此处当时将端口改为了8080
ansible appserver -a 'getent passwd nginx' :验证用户是否存在且为自定义属性
ansible appserver -a 'ls -l /etc/nginx/' :验证是否有备份文件,因为上面定义了备份
ansible appserver -a 'ls -a /data/nginx' :验证Apache用户家目录,上面指定了家目录
handlers和notify结合使用触发条件
handlers
也和tasks一样是一个列表,只不过 handlers是被动触发才执行,这些task与前述的task并没有本质上的不同,用于关注的资源变化时,才会采取定义的操作
notify
此动作可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,
仅在所有的变化发生完成之后一次性执行指定的操作,在notify中列出的操作称为handler,
也即notify中调用handler中定义的操作
示例:拿上面的playbook做实验:
vim install_httpd.yml
---
- hosts: appserver
remote_user: root
tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache home=/data/httpd group=apache shell=/sbin/nologin uid=80 pass
word='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfg
irYaeNOZQWmVGD9o/2Bj3n2fCS/'
- name: install httpd
yum: name=httpd
- name: copy config_file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
# notify: restart service :此处定义notify触发条件,要求此处和handlers中的任务名必须相同
notify :多个触发条件写法稍微不同
- restart service :第一个触发条件,前提是httpd.conf文件修改了内容,没有修改内容不会触发
- check service :第二个触发条件
- name: start httpd service
service: name=httpd state=started enabled=yes
handlers: :handlers和tasks一样是一个列表
- name: restart service :此处就是任务的名称,要求此处的名字必须和notify相同
service: name=httpd state=restarted
- name: check service :被触发后执行以下命令
shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log :执行时要确定远程主机有没有killall这个命令
killall命令来自psmisc包,没有就安装这个包
tags:标签
为某一个任务添加标签,通常为一个单词。一个动作可有两个标签,使用逗号隔开,使得每次不用执行整个playbook,从而节约资源和时间
示例:拿上面的playbook做实验:
vim install_httpd.yml
---
- hosts: appserver
remote_user: root
tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache home=/data/httpd group=apache shell=/sbin/nologin uid=80 pass
word='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfg
irYaeNOZQWmVGD9o/2Bj3n2fCS/'
- name: install httpd
yum: name=httpd
- name: copy config_file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
tags: config,copy :添加标签名,多个标签使用逗号隔开,两个标签执行效果相同
在执行此标签时,下方的notify同时出发,所以handlers中命令也会执行
notify
- restart service
- check service
- name: start httpd service
tags: service :添加标签名
service: name=httpd state=started enabled=yes
handlers:
- name: restart service
service: name=httpd state=restarted
- name: check service
shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log
执行标签 -t 指定标签名
ansible-playbook -t config install_httpd.yml
ansible-playbook -t "config,service" install_httpd.yml :可一次执行两个标签,逗号隔开,注意引号"
笔记记录,不喜请绕路!
版权声明:本文标题:自动化运维工具ansible 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725737301a1039872.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论