nsible常用模块(5)
ansible常用模块
2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块
虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块常用模块帮助文档参考:https : / /docs.ansible.com/ansible/latest/modules/modules_by_category.html
command模块
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
注意:此命令不支持$VARNAME< >|;&等,用shell模块实现
范例:
[root@ansible ~]# ansible webserver -m command -a 'cat /etc/centos-release' 192.168.10.13 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)
[root@ansible ~]# ansible webserver -m command -a 'chdir=/etc creates=/data/f1.txt cat /etc/centos-release'
192.168.10.13 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)
chdir: 进入到被管理主机目录
creates: 如果有一个目录是存在的,步骤将不会运行Command命令
ansible websrvs -a 'chdir=/data/ ls'
shell模块
Shell:和command相似,用shell执行命令
[root@ansible ~]# ansible webserver -m shell -a 'echo $HOSTNAME' #查看节点名称
192.168.10.13 | CHANGED | rc=0 >>
node1
[root@ansible ~]# ansible webserver -m shell -a 'echo hello >/data/hello.log' #写入文件
192.168.10.13 | CHANGED | rc=0 >>
[root@ansible ~]# ansible webserver -m shell -a 'cat /data/hello.log' #查看文件
192.168.10.13 | CHANGED | rc=0 >>
hello
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
这些复杂命令,即使使用shell也可能会失败,
解决办法:写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器
修改配置文件,使shell作为默认模块
vim /etc/ansible/ansible.cfg
module_name = shell
Script模块
在远程主机上运行ansible服务器上的脚本
-a "/PATH/TO/SCRIPT_FILE"
ansible websrvs -m script -a /data/test.sh
实例:
[root@ansible ~]# vi /data/test.sh
!bin/bash
My hostname is hostname
ansible webserver -m script -a 'data/test.sh'
192.168.10.13 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.10.13 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.10.13 closed."
],
"stdout": "My hostanme is node1\r\n",
"stdout_lines": [
"My hostanme is node1"
]
}
copy模块
从主控端复制文件到远程主机
src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)
dest: 指定目标路径
mode: 设置权限
backup: 备份源文件
content: 代替src 指定本机文件内容,生成目标主机文件
[root@ansible ~]# ansible webserver -m copy -a "content='test content\nxxx' #进行复制dest=/tmp/test.txt"
192.168.10.13 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "b6ce6d290b30e300afcf4761f47a17bb0ab2e55c",
"dest": "/tmp/test.txt",
"gid": 0,
"group": "root",
"md5sum": "d5d92a8132a05e7a0d1ce6c50b3bcd01",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 16,
"src": "/root/.ansible/tmp/ansible-tmp-1664750464.1800458-138162915330626/source",
"state": "file",
"uid": 0
}
[root@ansible ~]# ansible webserver -a "cat /tmp/test.txt" #进行查看
192.168.10.13 | CHANGED | rc=0 >>
test content
xxx
Fetch模块
从远程主机提取文件至主控端,copy相反,目前不支持目录,可以先打包,再提取文件
ansible webserver -m fetch -a 'src=/root/test.sh dest=/data/scripts'
[root@ansible ~]# ansible webserver -m fetch -a 'src=/root/test.sh dest=/data/scripts'
192.168.10.13 | CHANGED => {
"changed": true,
"checksum": "4080c03edf24ad1ca3a9e83c54a363236df4432b",
"dest": "/data/scripts/192.168.10.13/root/test.sh",
"md5sum": "6c65510d520b68b9ef4d5f76552e8a98",
"remote_checksum": "4080c03edf24ad1ca3a9e83c54a363236df4432b",
"remote_md5sum": null
}
实例2:
[root@ansible ~]# ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/os'
[root@ansible ~]# tree /data/os
/data/os
├── 192.168.10.13
│ └── etc
│ └── redhat-release
└── 192.168.10.14
└── etc
└── redhat-release
会生成每个被管理主机不同编号的目录,不会发生文件名冲突
ansible all -m shell -a 'tar jxvf test.tar.gz /root/test.sh'
ansible all -m fetch -a 'src=/root/test.tar.gz dest=/data/'
File模块
设置文件属性
path: 要管理的文件路径 (强制添加)
recurse: 递归,文件夹要用递归
src: 创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接 s
tate: 状态
ansible webserver -m file -a 'path=/app/test.txt state=touch' 创建文件
ansible webserver -m file -a "path=/data/testdir state=directory" 创建目录
ansible webserver -m file -a "path=/root/test.sh owner=wang mode=755" 设置权限755
ansible webserver -m file -a 'src=/data/testfile dest=/data/testfile-link state=link' 创建软链接
实例:
[root@ansible ~]# ansible webserver -m file -a 'path=/data/test.txt state=touch'
192.168.10.13 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"dest": "/data/test.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": 0,
"state": "file",
"uid": 0
unarchive模块
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes.
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
**copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上, **
**如果设置为copy=no,会在远程主机上寻找src源文件 **
**src: 源路径,可以是ansible主机上的路径,也可以是远程主机上的路径, **
**如果是远程主机上的路径,则需要设置copy=no **
dest:远程主机上的目标路径 **
** mode:设置解压缩后的文件权限
ansible webserver -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
#默认copy为yes ,将本机目录文件解压到目标主机对应目录下
ansible webserver -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
解压被管理主机的foo.zip到data目录下, 并设置权限777
ansible webserver -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
Archive模块
打包压缩
实例
ansible all -m archive -a 'path=/etc/sysconfig dest=/data/sysconfig.tar.bz2 format=bz2 owner=root mode=0777' 将远程主机目录打包
进行查看
[root@ansible ~]# ansible webserver -a 'ls -l /data/sysconfig.tar.bz2 '
192.168.10.13 | CHANGED | rc=0 >>
-rwxrwxrwx. 1 root root 5025 10月 3 07:11 /data/sysconfig.tar.bz2
[root@ansible ~]# ansible webserver -a 'file /data/sysconfig.tar.bz2 '
192.168.10.13 | CHANGED | rc=0 >>
/data/sysconfig.tar.bz2: bzip2 compressed data, block size = 900k
:::
** path: 指定路径 **
** dest: 指定目标文件 **
** format: 指定打包格式 **
** owner: 指定所属者 **
** mode: 设置权限 **
hostname模块
管理主机名称
ansible webserver -m hostname -a "name=app.adong.com" 更改一组的主机名
ansible 192.168.38.103 -m hostname -a "name=app2.adong.com" 更改单个主机
corn模块
支持时间:minute,hour,day,month,weekday
ansible webserver-m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" 创建任务
ansible webserver -m cron -a 'state=absent name=Synctime' 删除任务
ansible webserver -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes' 注释任务,不在生效
Yum模块
管理包
ansible webserver -m yum -a 'list=httpd' 查看程序列表
安装
ansible webserver -m yum -a 'name=httpd state=absent' 删除
可以同时安装多个程序包
Service模块
管理服务
ansible -m service -a 'name=httpd state=stopped' 停止服务
ansible webserver -m service -a 'name=httpd state=started enabled=yes' 启动服务,并设为开机自启 ansible webserver -m service -a 'name=httpd state=reloaded' 重新加载
ansible webserver -m service -a 'name=httpd state=restarted' 重启服务
User模块
管理用户
** home 指定家目录路径 **
** system 指定系统账号 **
** group 指定组 **
** remove 清除账户 **
** shell 指定shell类型 **
ansible websrvs -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible websrvs -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible websrvs -m user -a 'name=user1 state=absent remove=yes' 清空用户所有数据
ansible websrvs -m user -a 'name=app uid=88 system=yes home=/app groups=root shell=/sbin/nologin password="$1$zfVojmPy$ZILcvxnXljvTI2PhP2Iqv1"' 创建用户
ansible websrvs -m user -a 'name=app state=absent' 不会删除家目录
安装mkpasswd
yum insatll expect
mkpasswd 生成口令
openssl passwd -1 生成加密口令
ansible -m user -a 'name=nginx state=absent remove=yes ' 删除用户及家目录等数据
Group模块
管理组
ansible webserver -m group -a "name=testgroup system=yes" 创建组
ansible webserver -m group -a "name=testgroup state=absent" 删除组
linefile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换。其实在ansible自身提供了两个模块: lineinfile模块和replace模块,可以方便的进行替换
功能:相当于sed,可以修改文件内容
实例:
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
Replace模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换
范例:
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(.)' replace='\1'"
Setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用gather_facts: no来禁止 Ansible 收集 facts 信息
范例:
[root@ansible ~]# ansible all -m setup(查看已经安装的东西)
192.168.10.14 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.10.14"
],
"ansible_all_ipv6_addresses": [
"fe80::fca3:e557:96eb:5c48",
"fe80::53d1:545c:1ce7:ef98",
"fe80::33d4:e648:f93:c5d0"
],
"ansible_apparmor": {
"status": "disabled"
示例
ansible all -m setup -a 'filter=ansible_python_version' 查看所有节点的ansible_python的版本
192.168.10.13 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}