tnblog
首页
视频
资源
登录

Ansible 使用和模块化深入解析

5792人阅读 2021/3/16 15:41 总访问:3470384 评论:0 收藏:0 手机
分类: Ansible

ansible

Ansible 使用和模块化深入解析

Ansible 主配置文件讲解

Ansible中的某些设置可以通过配置文件(ansible.cfg)进行调整。

Ansible读取配置文件的顺序


当前执行的上下文目录($PWD)
用户家目录($HOME)下的”.ansible.cfg”
/etc/ansible/ansible.cfg

确认Ansible配置文件


首先我们查看一下ansible.cfg文件是否存在

  1. # ansible --version
  2. ansible 2.10.6
  3. config file = None
  4. configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  5. ansible python module location = /usr/lib/python2.7/site-packages/ansible_base-2.10.6-py2.7.egg/ansible
  6. executable location = /bin/ansible
  7. python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]


这里我们并没有发现配置文件,所以我们需要创建一个ansible.cfg的文件

  1. vim /etc/ansible/ansible.cfg
  2. # 然后将 https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg 写进去
  3. # 如果这样下载太慢还可以这样
  4. # curl -L https://raw.staticdn.net/ansible/ansible/devel/examples/ansible.cfg > /etc/ansible/ansible.cfg
  5. # 最后检查一遍
  6. # ansible --version
  7. ansible 2.10.6
  8. config file = /etc/ansible/ansible.cfg
  9. configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  10. ansible python module location = /usr/lib/python2.7/site-packages/ansible_base-2.10.6-py2.7.egg/ansible
  11. executable location = /bin/ansible
  12. python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

讲解Ansible配置文件

大分类配置模块 描述
[defaults] 定义常规默认的配置,如:定义文件路径、设置并发连接数、设置sudo用户、是否开启sudo功能等等
[inventory] 设置插件及可忽略的文件格式(没几个参数,个人感觉用的地方不多)
[privilege_escalation] 用户权限类的设定,如:sudo、是否启用sudo密码
[paramiko_connection] 不记录遇到的新主机密钥、增加新主机的性能。(用的地方不多)
[ssh_connection] 对SSH连接的一些配置,配置项比较少
[persistent_connection] 主要就两个选项,连接超时、命令超时
[accelerate] 连接加速的相关配置
[selinux] selinux相关配置,基本不会涉及
[colors] 设置输出颜色,最好默认
[diff] 输出打印是是否打印diff
[defaults]模块
参数 描述
inventory 主机清单的文件
library 库的位置
module_utils 模块的路径
remote_tmp 远程临时脚本目录(执行完后会删除)
local_tmp 本地临时脚本目录(执行完后会删除)
plugin_filters_cfg 插件的配置文件
forks 并行多少台主机进行执行
poll_interval 多长时间去拉一次数据
sudo_user 以管理员的权限进行执行
ask_sudo_pass 询问是否需要管理员的口令
ask_pass 询问是否需要普通的口令
remote_port 远程主机的端口号
module_lang 模块语言
log_path 日志文件(这个最好也记录一下)
host_key_checking 是否检查对方的密钥也就是ssh的known_hosts(一般把这个注释取消)

Ansible系列命令

ansible-doc 显示模块帮助


命令:ansible-doc [options] [module]
参数如下表所示:

参数 描述
-a 显示所有模块的文档
-l,—list 列出可用模块
-s,—snippet 显示指定模块的play (缩减内容)

举例查看ping模块:ansible-doc pingansible-doc -s ping

ansible


ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证端方式联系各被管理节点

ansible [host-pattern] [-m module_name] [-a args]

参数 描述
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 -vv-vvv更详细
--list-hosts,--list 显示主机列表,可简写—list
-k,--ask-pass 提示输入sudo时的口令
-K,--ask-become-pass 提示输入sudo时的口令
-C,--check 检查,并不执行
-T,--timeout=TIMEOUT 执行命令的超时时间,默认10s
-u,--user=REMOTE_USER 执行行程执行的用户
-b,--become 代替旧版的sudo切换

列出组主机清单与所有主机清单

  1. # ansible dbserver --list-hosts
  2. hosts (1):
  3. 10.211.55.5
  4. # ansible all --list-hosts
  5. hosts (2):
  6. 10.211.55.5
  7. 10.211.55.6

使用command模块


使用管理员权限访问/root目录

  1. ansible webserver -u root -k -m command -a 'ls /root'


我们通过aidasi用户用以root的账号密码去遍历/root目录下的文件

  1. ansible webserver -u aidasi -k -m command -a 'ls /root' -b -K

新用户设置为管理员访问


如果我们的用户没有该root的访问权限,那么我们可以一台一台的去添加wheel组,以及添加testuser账号,每台可以按照如下步骤操作:

  1. # 添加用户
  2. useradd testuser
  3. # 添加密码
  4. passwd testuser
  5. # 开通wheel组
  6. visudo

  1. # 将testuser添加到wheel组里面去
  2. usermod -aG wheel testuser


最后通过testuser去访问试试

  1. # 使用testuser进行管理员管理
  2. ansible webserver -u testuser -k -m command -a 'ls /root' -b -K


但是我们发现它要输入两次密码比较麻烦,所以我们可以在设置wheel的时候进行修改,像下图修改后就不会输入两次密码了。

密钥访问


但这样还是觉得麻烦的话可以通过密钥的形式进行远程操作,不需要输入密码了,在主机上进行如下操作

  1. # 生成密钥(全部回车)
  2. ssh-keygen
  3. # 将密钥分发给各个子机
  4. ssh-copy-id 10.211.55.5
  5. ssh-copy-id 10.211.55.5
  1. # ansible webserver -m command -a 'ls /root'
  2. 10.211.55.5 | CHANGED | rc=0 >>
  3. anaconda-ks.cfg
  4. original-ks.cfg
  5. 10.211.55.6 | CHANGED | rc=0 >>
  6. anaconda-ks.cfg
  7. original-ks.cfg

ansible的Host-pattern


All :表示所有Inventory中的所有主机

  1. ansible all -m ping


* :通配符

  1. ansible "*" -m ping
  2. ansible 10.211.55.* -m ping
  3. ansible "*server" -m ping


或关系上

  1. # cat /etc/ansible/hosts
  2. [webserver]
  3. 10.211.55.5
  4. 10.211.55.6
  5. [dbserver]
  6. 10.211.55.5
  7. # 获取指定这两个组的访问
  8. ansible "dbserver:webserver" -m ping
  9. # 获取指定ip模块的访问
  10. ansible 10.211.55.5:10.211.55.6 -m ping


逻辑与

  1. # 在webserver组并且在dbserver组中的主机
  2. ansible "webserver:&dbserver" -m ping


逻辑非

  1. # 在webserver组,但不在dbserver组中的主机 注意:此处为单引号。
  2. ansible 'webserver:!dbserver' -m ping


综合逻辑

  1. ansible 'webserver:dbserver:&webserver:!dbserver' -m ping


正则表达式

  1. ansible 'webserver:&dbserver' -m ping
  2. ansible '~(db|web)server' -m ping

ansible命令执行过程


ansible命令执行过程:

1. 加载自己的配置文件默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.py文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,sleep 0退出

执行状态:

绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败

可以在执行模块后面加-v,-vv-vvv显示得更加详细哟

ansible常见模块

command模块


Command :是在远程主机上执行命令的模块,也是默认模块,可以不用写-m选项,关于该模块的参数如下表所示

参数 描述
chdir 在运行该命令之前,请切换到此目录。
creates 判断指定文件存在,则后面的命令不执行
removes 判断指定文件不存在,则后面的命令不执行

更多请参考:ansible-doc command


chdir参数应用,例如我要到/etc目录下执行ls的命令

  1. ansible all -a 'chdir=/etc ls'


creates参数应用,例如有/home/a.sh文件,我就不执行后面的语句

  1. ansible all -a 'creates=/home/a.sh echo "not find a.sh"'
  2. # removes 反之
  3. ansible all -a 'removes=/home/a.sh echo "not find a.sh"'


但是这个模块不可以使用环境变量,以及管道字符(< > | ; &)使用起来有问题如:
ansible all -a 'echo $SUDO_USER'
所以这个时候就有Shell模块出现了

Shell模块


Shell模块与Command相似,相当与在Command上支持环境变量的输出与管道的支持
示例

  1. # 随便输出一个环境变量
  2. ansible all -m shell -a 'echo $XDG_RUNTIME_DIR'
  3. # 创建`/root/a.sh`文件
  4. ansible all -m shell -a '> /root/a.sh'

Secript模块


只需要在本地写一个shell脚本,然后就可以在其他子机上执行。

  1. vim b.sh
  2. #!/bin/bash
  3. hostname
  4. # 执行这个脚本
  5. ansible all -m script -a '/home/aidasi/ansible-2.9.13/b.sh'

Copy模块


Copy模块可以将文件复制到指定目录下,我们可以通过ansible-doc -s copy来查看该模块的详细内容

参数 描述
backup 创建一个包含时间戳信息的备份文件,以便在错误地重击原始文件时可以将其取回。
dest 文件应复制到的远程绝对路径。
mode 文件权限
src 要复制到远程服务器的文件的本地路径。
owner 所有者
content 直接写入内容


接着我们通过一个关闭SeLinux的方式来使用该方法

  1. # 查看Selinux是否启动
  2. ansible all -m shell -a 'getenforce'
  3. # 查看selinux
  4. ansible all -a 'ls -l /etc/sysconfig/selinux'
  5. # 结果我们发现这个才是真实的路径,上面是个软连接
  6. ansible all -a 'ls -l /etc/selinux/config'
  7. # 然后我们先将本地的文件修好
  8. vim /etc/selinux/config
  9. SELINUX=disabled
  10. # 然后将文件复制过去
  11. ansible all -m copy -a 'src=/etc/selinux/config dest=/etc/selinux/config backup=yes'
  12. # 检查一下文件
  13. ansible all -m shell -a 'cat /etc/selinux/config'
  14. # 最后重启然后过几分钟再检查一遍
  15. ansible all -m shell -a 'reboot'
  16. ansible all -m shell -a 'getenforce'


然后我们也可以用所有者是testuser去设置文件权限

  1. ansible all -m copy -a 'src=/home/aidasi/ansible-2.9.13/b.sh dest=/root mode=000 owner=testuser'
  2. # 然后查看权限
  3. ansible all -m shell -a 'ls -al'
  4. ---------- 1 testuser root 21 3 18 22:10 b.sh


你也可以直接通过写内容的方式

  1. ansible all -m copy -a 'content="hello\nthanks\n" dest=/root/f1'

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

如何升级到 Ansible 的最新版本

如何升级 Ansible 的版本[TOC] 访问 https://pypi.org/project/ansible/#files 找到 ansible-{版本}.tar.gz #下载到本...

如何解决 Ansible Galaxy SSL报错

如何解决 Ansible Galaxy SSL报错[TOC] 当我们下载插件的时候ansible-galaxy install geerlingguy.nginx,会报如下错误 ...

Ansible 安装与简介

Ansible 安装与简介[TOC] Ansible简介 Ansible是您安装在控制节点上的无代理自动化工具。Ansible从控制节点远程管理计算...

Ansible 常见企业级应用实战

Ansible 常见企业级应用实战[TOC] Fetch模块从客户端取文件至服务器端,与copy模块相反,我们可以通过ansible-doc -s fetch...

Ansible Playbook的用法

Ansible Playbook的用法[TOC] Ansible-galaxy它可以连接 https://galaxy.ansible.com 下载相应的roles 相关命令# 列出...

Ansible Playbook的用法(变量与template)

Ansible Playbook的用法(变量与template)[TOC] 使用变量变量名:仅能由字母、数字和下划线组成,且只能以字母开头。我们...

Ansible Role详解

Ansible Role详解[TOC] RolesRoles介绍ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据...
这一世以无限游戏为使命!
排名
2
文章
635
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术