Ansible 自动化运维 1 常用模块
环境:centos7.9 yum安装
1. 依赖包安装
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
2. yum安装
yum install -y ansible
3.编辑主机清单
vi /etc/ansible/hosts #主机组标签 [主机组标签名] #组内主机ip地址 x.x.x.x x.x.x.x
4.测试ping模块
ansible 主机清单名 -m ping #此时就会按照主机清进行ping测试 -m指定模块
5.查看组内主机信息
ansible 组名 --list
ansible默认模块是command模块,不制定模块的时候模块就是command模块。
5.1 查看组内所有主机的系统版本信息
ansible test -m command -a 'cat /etc/redhat-release'
可以省略-m command
ansible test -a 'chdir=/etc cat redhat-release'
注意:-a 不能省略
command模块在命令执行上有局限性,有些命令执行后提示成功,其实并没有执行成功。不支持变量,部分符号等等。为了解决command模块的局限性,可以使用shell模块
6.shell模块
ansible test -m shell -a 'echo $HOSTNAME'
注意:在上面的命令 中 shell模块支持变量,但是命令本身必须用单引号,双引号无效,双引号看到的应该都是ansible控制主机本身的
既然shell模块比command模块支持的范围大,那么将shell模块设置为默认的模块不是更加快捷和高效吗?
当然可以,方法是更改ansible配置文件,/etc/ansible/ansible.cfg 将已经注释的#module_name=command 更改为shell并去掉前面的注释即可生效
vi /etc/ansible/ansible.cfg module_name=shell
7.script模块
当我们通过shell模块或者command模块想要执行一个脚本的时候,通常的前提是这个脚本存在于主机清单内的每台主机上,而script模块则不需要如此麻烦的前提 ,在ansible控制主机上的脚本可以通过script模块直接批量执行
vi test.sh #!/bin/bash echo "My hostname is `hostname`"
ansible test -m script -a '/root/test.sh'
即可
其实也是拷贝过去的,只是ansible完成了远程拷贝的过程,是在远程主机的.ansible/tmp下,执行完成后删除了这个脚本而已。
8. copy模块 从ansible服务器主控端复制文件到远程主机,可以拷贝目录
ansible test -m copy -a "src=源文件路径 dest=目标路径 owner=xxx mode=600 backup=yes" #owner更改属主 backup=yes是如果有同名文件,则备份一份 #mode是权限指定
9. fetch 模块 将远程主机的文件提取到ansible控制端,不支持目录
ansible test -m fetch -a 'src=/etc/redhat-release dest=/data/'
上面的目录会将远程主机的redhat-release文件抓取到ansible控制daunt的/data目录下,并生成以主机IP地址为目录名的子目录来存放文件
10. file模块 设置文件属性
#在path指定的路径下创建某个文件 ansible test -m file -a ’path=路径 state=touch' #在path指定的路径下删除某个文件 ansible test -m file -a 'path=路径 state=absent' #在path指定的路径下递归修改文件的各项指定属性 ansible test -m file -a 'path=路径 owner=xxx mode=775' #在path指定的路径下创建目录 ansible test -m file -a 'path=路径 state=directory owner=xxx group=xxx' #创建软连接 ansible test - m file -a 'src=xxx dest=xxx state=link'
11. unarchive 模块 解包解压缩
将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
关于copy参数: 默认为yes,当copy=yes时,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no时,会在远程主机上寻找src文件
remote_src参数:和copy功能一样互斥,yes表示文件在远程主机上,no表示文件在ansible主机上
src参数:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,需要配合copy参数使用
dest参数:远程主机上的目标路径
mode参数:设置解压缩后的文件权限。
12. archive 打包模块
ansible test -m archive -a 'path=/var/log dest=/data/log.tar.bz2 format=bz2 owner=xxx mode=600' #将指定路径path下的文件打包,dest是目的路径 打包格式format指定 #属主是owner指定,mode指定权限
13. hostname 改名模块
ansible 主机ip -m hostname -a 'name=hostname.xx.com'
14. cron 计划任务模块 支持时间:minute hour day month weekday
#范例 ansible 192.168.10.10 -m cron -a 'hour=2 minute=30 weekday=1-5 ="backup mysql" job=脚本绝对路径.sh'
禁用某个计划任务
ansible 192.168.10.10 -m cron -a 'hour=2 minute=30 weekday=1-5 ="backup mysql" job=脚本绝对路径.sh disable=yes'
#注意disable选项
删除计划任务
ansible 主机ip -m cron -a 'name="xxx" state=absent' #注意state=absent就代表删除
15. yum模块 --管理安装包,只支持RHEL CENTOS fedora 不支持Ubuntu
ansible 主机组 -m yum -a 'name=xxx state=present' #state=present为安装 state=absent 为删除
16. Service模块 --管理服务
ansible 主机组 -m service -a 'name=xxx state=started enabled=yes' #state=started为启动 enabled=yes为开机自启动 stopped为停止 reloaded 重载 restarted 重启服务
17. User模块--管理用户
ansible 主机组 -m user -a 'name=user1 comment="test user" uid=2222 home=/home/user1 group=xxxx' #create_home=no 不创建家目录 ansible 主机组 -m user -a 'name=user1 state=absent remove=yes' #删除用户
18. Group模块--管理组
ansible 主机组 -m group -a 'name=xxxx gid=xxx system=yes' #system=yes 指定为系统组 ansible 主机组 -m group -a 'name=xxxx state=absent' #删除组
19. Lineinfile模块--ansible在使用sed进行替换时,经常会遇到需要转义的问题,而ansible在遇到特殊符号进行替换时,存在问题,无法正常替换,其实在ansible中提供了2 个模块,lineinfile和replace模块。
ansible 主机组 -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"
#将/etc/selinux/config中以SELINUX=开头的行替换成SELINUX=enforcing
ansible 主机组 -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
#删除/etc/fstab中以#开头的行
20. replace模块--该模块类似于sed命令,主要也是基于正则进行匹配和替换。
ansible 主机组 -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'" #将/etc/fstab中以UUID开头的行加上#号,即注释掉
21. setup模块 收集主机的系统信息,这些facts信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,
ansible 主机组 -m setup -a'filter=键'
#filter用来过滤内容