开发者学堂课程【自动化运维工具 Ansible 实战:Ansible 使用和模块化深入解析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/577/detail/7975
Ansible 使用和模块化深入解析
内容介绍
一、ansible 配置文件
二、ansible 系列命令
三、ansible 命令用法
四、ansible 的 Host-pattern(主机模式)
五、ansible 命令执行过程
六、执行状态
七、ansible 使用示例
八、ansible 常用模块
一、ansible 配置文件
Ansible 配置文件 /etc/ansible/ansible. cfg (一般保持默认) ,输入:vim /etc/ansible/ansible.cfg 这就是 ansible 的主配置文件,由许多”[]”分成许多语句,最主要的
[defaults] #inventory=/etc/ansible/hosts# 主机列表配置文件
#library=/usr/share/my _ modules/# 库文件存放目录
#remote _ tmp=$HOME/. ansible/tmp# 临时 ρy 命令文件存放在远程主机目录(最后会删除)#local _ tmp=$HOME/. ansible/tmp# 本机的临时命令执行目录
#forks=5# 默认并发数(如现在是5,那就会一次执行5个,然后再执行5个)
#sudo _ user=root#默认 sudo 用户
#ask _ sudo _ pass=True#每次执行 ansible 命令是否询问 ssh 密码
#ask _ pass=True
#remote _ port=22(远程主机端口号)
#host _ key _ checking=False# 检查对应服务器的 host _ key(检查主机时是否验证对方公钥,当与一台新主机连接时需要用命令连接),建议取消注释(取消后就不再需要密钥检查,无需一个个密钥连接)。
#log _ path=/var/log/ansible. log# 日志文件(建议启用,可记录 ansible 的操作)
二、ansible 系列命令
1、Ansible 系列命令
ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull
2、ansible-doc:显示模块帮助
ansible-doc[options][module...]
-a 显示所有模块的文档
-l,--list 列出当前模块列表有哪些,显示时需手动翻页
-s,--snippet 显示指定模块的 playbook 片段
示例:
ansible-doc-I 列出所有模块(加上 |wc-1可以统计出目前有1653个模块)
ansible-doc ping 查看指定模块帮助用法
[root@centos7,ssh]#ansible-doc ping
PING(/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns“pong'on successful contact. It does not make sense in playbooks, but it is useful from'/usr/bin/ansible'to verify the ability to login and that a usable Python is configured . This is NOT LCMP ping, this is just a trivial test module that requires Python on the remote-node. For wingdows targets, use the[wrin ping]module instead, For Network targets, use the[net _ ping]module instead.
OPTIONS(=is mandatory):
-data
Data to return for the ‘ping.'return value.
If this parameter is set to‘crash', the module will cause an exception.
[Default:pong]
NOTES:
*For windows targets, use the[win _ ping]module instead.
*For Network targets, use the[net _ ping]module instead.
AUTHOR:
Ansible Core Team, Michael DeHaan
METADATA:
status:
- stableinterface
supported _ by:core
EXAMPLES:
#Test we can logon to' webservers 'and execute python with json lib.
#ansible webservers-m ping
#Example from an Ansible Playbook
-ping:
#Induce an exception to see what happens
-ping:
data:crash
RETURN VALUES :
ping: description ;value provided with the data parameter
returned:success
type:string
sample:pong
(END)
ansible-doc-s ping
查看指定模块帮助用法(此格式会简单明了)
三、ansible 命令用法
1、ansible
通过 ssh 实现配置管理、应用部署、任务执行等功能,建议配置 ansisble 端能基于密钥认证的方式联系各被管理节点。
2、ansible(此为主机清单)[-m module _ name](模块名)[-a args](加模块的参数)
--version 显示版本
-m modul 指定模块,默认为 command
-v 详细过程 -vv -vvv 更详细
--list-hosts 显示主机列表,可简写 list
-k,--ask-pass 提示输入ssh连接密码,默认 Key 验证
-K,--ask-become-pass 提示输入 sudo 时的口令
-C,--check 检查,并不执行
-T,--timeout=TIMEOUT 执行命令的超时时间,默认10s
-u,--user=REMOTE_USER 执行远程执行的用户
-b,--become 代替旧版的 sudo 切换
[root@centos7,ssh]#ansible dbsrvs-u wang-k-m command -a’ls/root’
此时以 wang 无法查看,但
[root@centos7,ssh]#ansible dbsrvs-root-k -m command -a’ls/root’
此时就可以连接,若还用 wang 连接就要用到 sudo,现在用 -b。
[root@centos7,ssh]#ansibledbsrvs-m command -a’ls/root‘-u wang -k -b-k
此时就可以实现 wang 的连接。(需要 visudo)
四、ansible 的 Host-pattern(主机模式)
1、ansible 的 Host-pattern
匹配主机的列表
(1)、All:表示所有 Inventory 中的所有主机‘
ansible all-m ping
(2)、*:通配符
ansible" * "-m ping
ansible 192. 168.1.*−mping
ansible"*srvs"ping
(3)、: 表示或关系
ansible“websrvs:appsrvs"-m ping ansible“192. 168.1. 10:192. 168.1. 20”--mping
2、逻辑
ansible"websrvls&bsrvs"ping
(需注意&需加“”或’’都可以)
在 websrvs 组并且在 dbsrvs 组中的主机
3、逻辑非
ansible'websrvs:!dbsrvs'-m ping
在 websrvs 组,但不在 dbsrvs 组中的主机
注意:此处需为单引号’
4、综合逻辑
ansible'websrvs:dbsrvs:&appsrvs:lftpsrvs'-m ping
5、正则表达式
ansible"websrvs:dbsrvs"
ansible"~(web/db).*\. magedu\. com"-m ping
五、ansible 命令执行过程
1、加载自己的配置文件默认
/etc/ansible/ansible. cfg
2、加载自己对应的模块文件,
如 command
3、通过 ansible
将模块或命令生成对应的临时 ργ 文件,并将该文件传输至远程服务器的对应执行用户
$HOME/. ansible/ttp/ansible-tmp- 数字 /XXX.PY 文件
4、给文件 +x 执行
5、执行并返回结果
6、删除临时 py 文件,sleep 0退出
[root@ansible ~]#ansible all -m ping -vvv
来显示详细过程,会看到有复制文件的过程,文件传过去的过程都会展现出来。
六、执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
当然颜色是可以更改的。
绿色:成功并且对系统目标系统没有做任何修改。
黄色:成功并且对远程主机做过更新更改了,比如在目标的主机上删了一个文件或者重启服务或者是把某一个配置文件改了内容了这都会变成黄色。
红色:执行失败,红色代表基本上全是错误相关。
如下:
[colors]
#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
七、ansible 使用示例
1、以 wang 用户执行 ping 存活检测
ansible all −m ping−u wang−k
2、以 wang sudo 至 root 执行 ping 存活检测
ansible all-m ping-u wang-b-k
3、以 wang sudo 至 mage 用户执行 ping 存活检测
ansible all-m ping-uwang-b-k-become-user mage
4、以 wang sudo 至 root 用户执行 Is
ansible all-m command-uwang-become-user=root-a'ls/root'-b-k-K
八、ansible 常用模块
1、Command:在远程主机执行命令,默认模块,可忽略 -m 选项
ansible srvs-m command -a'service vsftpd start'
ansible srvs-m command-a'echo-magedu[passwd--stdin wang'
不成功
可用 doc 来查看 command 的详细解释,可以看到 chdir(执行命令前切换文件夹),creates(如果一个文件或模式对应的文件已存在,将不执行之后的操作)与removes(如果不存在将不执行)两者相反(是关于条件的两种操作)。
此命令不支持$VARNAME< > | ; &等,所以用 shell 模块实现
2、Shell:和 command 相似,用 shell 执行命令
ansible srv-m shell-a'echo magedu | passwd-stdin wang'
[root@ansible ~]#ansible 192.168.30.* -m shell -a’echo magedu passwd –stdin tesel’
就完成了无需 command 繁琐的过程。
调用 bash 执行命令类似
cat/ttp/stanley. md | awk-F'|'{print$1,$2}'&>/tmp/example. txt
这些复杂命令,即使使用 shell 也可能会失败,解决办法:写到脚本时,copy 到远程,执行,再把需要的结果拉回执行命令的机器。
3、Script:运行脚本
-a"/PATH/TO/SCRIPT_FILE"
snsible websrvs-m script-af1. sh
它不需要脚本,在 ansible 中编译好脚本就可推送到各个主机
[root@ansible ~]#chmod +x host.sh
[root@ansible~]#ansibleall-mscript -a’/root/ansible/host.sh’
这就把脚本推了过去,从 doc 看出 script 用法与 command 和 shell 类似。
4、Copy:从服务器复制文件到客户端
ansible srv-m copy-a“src=/root/f1. sh dest=/tmp/f2. sh owner=wang mode=600 backup=yes"
如目标存在,默认覆盖,此处指定先备份
ansiblesrν-m copy-a“content='test content\n'dest=/tmp/f1. txt"
利用内容,直接生成目标文件。
[root@ansible ~]#ansible all -a ‘ls -l/etc/selinux/confing’
之后:[root@ansible~]#ansibleall-mcopy a’src=/root/ansible/selinux/config backup=yes’
这里做好备份,然后覆盖过去。[root@ansible~]#ansibleall-mshell-a’rm -f/etc/selinux/config’
此时就把备份删除了。
5、Fetch:
从客户端取文件至服务器端,copy 相反,目录先 tar。
ansible’srv-m fetch-a‘src=/root/a. sh dest=/data/scripts'
6、File:设置文件属性
ansible srv-m file-a"path=/root/a. sh owner=wang mode=755“
ansibleweb-mfile-a'src=/app/testfile dest=/app/testfile-l
ink state=link'