Ansible中常用模块
一、Ansible命令运行方式及常用参数
1、命令的格式:
ansible 清单 -m 模块 -a 模块参数
2、常用的参数:
名称 | 含义 |
---|---|
- -version | 显示版本 |
-m module | 指定模块,默认为command模块 |
-v | 详细过程 -vv -vvv更详细过程 |
- -list | 显示主机列表,也可以用–list-hosts |
-k | 提示输入ssh连接密码,默认key认证 |
-C | 预执行检测 |
-T | 执行命令的超时时间,默认10s |
-b | 执行sudo切换身份操作 |
-become-user=USERNAME | 指定sudo的用户 |
-K | 提示输入sudo密码 |
二、Ansible中常用模块
a、ping模块
语法:
ansible hosts主机清单 -m 模块名
[root@192 ansible]# ansible 192.168.129.135 -m ping
[root@192 ansible]# ansible all -m ping //all代表所有主机清单
[root@192 ansible]# ansible web -m ping
192.168.129.135 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
b、command模块
command模块用于在远程主机上执行命令,ansible默认就是使用command模块。不能使用特殊得符号 :| > >>
官方文档:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
常用参数
名称 | 含义 |
---|---|
chdir | 执行命令前先进入到指定目录 |
cmd | 运行命令指定 |
creates | 当指定文件存在时,后一条命令不执行 / 指定文件不存在,后一条命令执行 |
removes | 当指定文件存在时,后一条命令执行 / 指定文件不存在,后一条命令不执行 |
语法:
ansible 主机清单 -m 模块名 -a ‘执行命令’
# /etc文件存在,则touch命令不执行
[root@192 ansible]# ansible web -m command -a 'chdir=/tmp creates=/etc touch file1'
192.168.129.137 | SUCCESS | rc=0 >>
skipped, since /etc exists
# /etc文件存在,则touch命令执行
[root@192 ansible]# ansible web -m command -a 'chdir=/tmp removes=/etc touch file1'
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.129.137 | CHANGED | rc=0 >>
linux中的通配符 | 重定向在command模块中不适用
[root@192 ansible]# ansible web -m command -a 'chdir=/tmp rm -rf *'
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.129.137 | CHANGED | rc=0 >>
[root@shazi tmp]# ls
file1
[root@192 ansible]# ansible web -m shell -a 'chdir=/tmp rm -rf *'
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.129.137 | CHANGED | rc=0 >>
[root@shazi tmp]# ls
c、raw模块
raw模块支持管道符与重定向
//支持重定向
[root@192 ansible]# ansible web -m raw -a 'echo 'hello' > /tmp/abc'
192.168.129.137 | CHANGED | rc=0 >>
Shared connection to 192.168.129.137 closed.
[root@192 ansible]# ansible web -m command -a 'cat /tmp/abc'
192.168.129.137 | CHANGED | rc=0 >>
hello
//支持管道符
[root@192 ansible]# ansible web -m raw -a'cat /tmp/abc | grep -Eo hello'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | CHANGED | rc=0 >>
hello
Shared connection to 192.168.129.137 closed.
d、shell模块
shell模块用于在受控机上执行受控机上的脚本,亦可直接在受控机上执行命令。
shell模块亦支持管道与重定向。
官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
- 常用参数
名称 | 含义 |
---|---|
chdir | 执行命令前先进入到指定目录 |
creates | 如果文件存在则不执行 |
removes | 如果文件存在将执行 |
[root@192 ansible]# ansible web -m shell -a 'ls /tmp | grep file'
192.168.129.137 | CHANGED | rc=0 >>
file
[root@192 ansible]# ansible web -m shell -a 'mkdir /root/test1'
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.129.137 | CHANGED | rc=0 >>
[root@shazi ~]# ls
abc anaconda-ks.cfg test1
- ansible常用模块raw、command、shell的区别:
名称 | 含义 |
---|---|
shell模块 | 调用/bin/sh指令执行 |
command模块 | 不是调用的shell的指令,所以没有bash的环境变量 |
raw模块 | 很多地方和shell类似,更多的地方建议使用shell和command模块 |
e、script模块
script模块用于在受控机上执行主控机上的脚本
[root@192 ansible]# mkdir /scripts
[root@192 ~]# cd /scripts/
[root@192 scripts]# cat a.sh
#! /bin/bash
echo hello world
echo zhi shazi
echo xioii
[root@192 scripts]# chmod +x /scripts/a.sh
[root@192 scripts]# ll /scripts/a.sh
-rwxr-xr-x. 1 root root 30 Jul 18 12:31 /scripts/a.sh
[root@192 scripts]# ansible web -m script -a '/scripts/a.sh'
192.168.129.137 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.129.137 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.129.137 closed."
],
"stdout": "hello world\r\nzhi shazi\r\nxioii\r\n",
"stdout_lines": [
"hello world",
"zhi shazi",
"xioii"
]
}
f、template模块
template模块用于生成一个模板,并可将其传输至远程主机上。
1、下载一个Centos-8的yum源文件
[root@192 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2595 100 2595 0 0 10136 0 --:--:-- --:--:-- --:--:-- 10136
2、将Centos-8源传到受控主机
[root@192 yum.repos.d]# ansible web -m template -a 'src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/Centos8.repo'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "4966466ad015ef3d2a3cc0b8252d43efbdcf2c94",
"dest": "/etc/yum.repos.d/Centos8.repo",
"gid": 0,
"group": "root",
"md5sum": "d06fb7d5709727828bcaba7457ea673e",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:system_conf_t:s0",
"size": 2595,
"src": "/root/.ansible/tmp/ansible-tmp-1626586130.9004688-479453-51846552834534/source",
"state": "file",
"uid": 0
}
3、查看受控机上是否有Centos-8源
[root@shazi yum.repos.d]# ls
Centos8.repo CentOS-Base.repo redhat.repo
g、yum模块
官方文档:https://docs.ansible.com/ansible/latest/modules/yum_repository_module.html#yum-repository-module
参数 | 选项/默认值 | 释义 |
---|---|---|
name(required) | 指定软件名称信息 | |
state | absent/removed | 将软件进行卸载(慎用) |
= | present/installed | 将软件进行安装 |
latest | 安装最新的软件 yum update |
[root@192 etc]# ansible web -m yum -a "name=wget* state=installed"
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Installed: wget-1.19.5-10.el8.x86_64",
"Removed: wget-1.19.5-8.el8_1.1.x86_64"
]
}
[root@shazi ~]# rpm -qa | grep wget
wget-1.19.5-10.el8.x86_64
h、copy模块
copy模块用于复制文件至远程受控机。
官方文档:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
-
update_cache: 更新缓存
-
name: 要创建的文件名字
-
state: 状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
lastest: 安装为最新的版本
absent:表示删除 -
mode: 目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx 或 u = rw,g = r,o = r)
-
backup: 如果原目标文件存在,则先备份目标文件
-
force: 是否强制覆盖,默认为yes
-
owner: 目标文件属主
-
group: 目标文件属组
参数 | 选项/默认值 | 释义 |
---|---|---|
src | 指定将本地管理主机的什么数据信息进行远程复制 | |
backup | no* yes | 默认数据复制到远程主机,会覆盖原有文件(yes 将源文件进行备份) |
content | 在文件中添加信息 | |
dest(required) | 将数据复制到远程节点的路径信息 | |
group | 文件数据复制到远程主机,设置文件属组用户信息 | |
mode | 文件数据复制到远程主机,设置数据的权限 eg 0644 0755 | |
owner | 文件数据复制到远程主机,设置文件属主用户信息 | |
remote_src | no* yes | 如果设置为yes,表示将远程主机上的数据进行移动操作如果设置为no, 表示将管理主机上的数据进行分发操作 |
1、目的文件的权限
[root@192 ansible]# ansible web -m copy -a 'src=/root/mode.txt dest=/tmp mode=744'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/mode.txt",
"gid": 0,
"group": "root",
"mode": "0744",
"owner": "root",
"path": "/tmp/mode.txt",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
[root@192 ansible]# ansible web -m shell -a 'ls -l /tmp/mode.txt'
192.168.129.137 | CHANGED | rc=0 >>
-rwxr--r--. 1 root root 0 7月 18 12:54 /tmp/mode.txt
2、如果目的地文件已存在,备份目的地的原文件
[root@192 ansible]# ansible web -m copy -a 'src=/tmp/abc dest=/tmp/abc owner=ddd group=ddd mode=755 backup=yes'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"backup_file": "/tmp/abc.493505.2021-07-18@13:08:38~",
"changed": true,
"checksum": "71415f2fcb9291dd06cfc730ae2838e69e45c234",
"dest": "/tmp/abc",
"gid": 1001,
"group": "ddd",
"md5sum": "3c4ee07f99a204bb8a0a0f940a8e1fcd",
"mode": "0755",
"owner": "ddd",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 18,
"src": "/root/.ansible/tmp/ansible-tmp-1626584917.9604204-442099-277721032319/source",
"state": "file",
"uid": 1001
}
[root@shazi tmp]# ll
总用量 8
-rwxr-xr-x. 1 ddd ddd 18 7月 18 13:08 abc
-rw-r--r--. 1 root root 6 7月 17 17:56 abc.493505.2021-07-18@13:08:38~
-rwxr--r--. 1 root root 0 7月 18 12:54 mode.txt
[root@shazi tmp]# cat abc
linux
linux
hello
[root@shazi tmp]# cat abc.493505.2021-07-18@13\:08\:38~
hello
i、group模块
group模块用于在受控机上添加或删除组
官方文档:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
参数 | 选项/默认值 | 释义 |
---|---|---|
gid | 指创建的组ID信息 | |
name | 指创建组名称信息 | |
state | absent | 删除指定的用户组 |
= | present | 创建指定的用户组 |
1、在受控机上添加一个系统组,其gid为306,组名为zzz
[root@192 ~]# ansible web -m group -a 'name=zzz gid=306 state=present'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"gid": 306,
"name": "zzz",
"state": "present",
"system": false
}
[root@192 ~]# ansible web -m shell -a 'grep zzz /etc/group'
192.168.129.137 | CHANGED | rc=0 >>
zzz:x:306:
2、删除受控机上的zzz组
[root@192 ~]# ansible web -m group -a 'name=zzz state=absent'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"name": "zzz",
"state": "absent"
}
[root@192 ~]# ansible web -m shell -a 'grep zzz /etc/group'
192.168.129.137 | FAILED | rc=1 >>
non-zero return code
j、user模块
user模块用于管理受控机的用户帐号
官方文档:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
参数 | 选项/默认值 | 释义 |
---|---|---|
password | 请输入密码信息 | |
name | 指定用户名信息 | |
uid | 指定用户uid信息 | |
group | 指定用户主要属于哪个组 | |
groups | 指定用户属于哪个附加组信息 | |
shell | /bin/bash或/sbin/nologin | 指定是否能够登录 |
create_home | yes/no | 是否创建家目录信息 |
home | 指定家目录创建在什么路径 默认/home |
1、在受控机上添加一个系统用户,用户名为zzz,uid为366,设置其shell为/sbin/nologin,无家目录
[root@192 ~]# ansible web -m user -a 'name=zzz uid=366 system=yes create_home=no shell=/sbin/nologin state=present'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 366,
"home": "/home/zzz",
"name": "zzz",
"shell": "/sbin/nologin",
"state": "present",
"system": true,
"uid": 366
}
[root@192 ~]# ansible web -m shell -a 'grep zzz /etc/group'
192.168.129.137 | CHANGED | rc=0 >>
zzz:x:366:
[root@192 ~]# ansible web -m shell -a 'ls /home'
192.168.129.137 | CHANGED | rc=0 >>
ddd
hhh
hhr
2、修改zzz用户的uid为306
[root@192 ~]# ansible web -m user -a 'name=zzz uid=306'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"append": false,
"changed": true,
"comment": "",
"group": 366,
"home": "/home/zzz",
"move_home": false,
"name": "zzz",
"shell": "/sbin/nologin",
"state": "present",
"uid": 306
}
[root@192 ~]# ansible web -m shell -a 'grep zzz /etc/group'
192.168.129.137 | CHANGED | rc=0 >>
zzz:x:366:
[root@192 ~]# ansible web -m shell -a 'grep zzz /etc/passwd'
192.168.129.137 | CHANGED | rc=0 >>
zzz:x:306:366::/home/zzz:/sbin/nologin
3、删除用户时不删除家目录
[root@192 ~]# ansible web -m user -a 'name=zzz state=absent'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"force": false,
"name": "zzz",
"remove": false,
"state": "absent"
}
4、删除用户时删除用户的家目录
[root@192 ~]# ansible web -m user -a 'name=hhh state=absent remove=yes'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"name": "hhh",
"state": "absent"
}
k、service模块
service模块用于管理受控机上的服务
官方文档:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module
参数 | 选项/默认值 | 释义 |
---|---|---|
enabled | no /yes | 设置服务是否开机自启动 如果参数不指定,原有服务开机自启动状态进行保留 |
name (required) | 设置要启动/停止服务名称 | |
state= | reloaded | 平滑重启 |
= | restarted | 重启 |
= | started | 启动 |
= | stopped | 停止 |
- 查看受控机上的vsftpd服务是否启动
[root@192 ~]# ansible web -m shell -a 'systemctl is-active vsftpd'
192.168.129.137 | FAILED | rc=3 >>
inactivenon-zero return code
- 启动vsftpd服务
1、安装vsftpd服务
[root@192 ~]# ansible web -m yum -a 'name=vsftpd* state=installed'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Installed: vsftpd-3.0.3-33.el8.x86_64"
]
}
2、启动
[root@192 ~]# ansible web -m service -a 'name=vsftpd state=started'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
....此处省略N行
- 查看受控机上的vsftpd服务是否启动
[root@192 ~]# ansible web -m shell -a 'systemctl is-active vsftpd'
192.168.129.137 | CHANGED | rc=0 >>
active
- 查看受控机上的vsftpd服务是否开机自启
[root@192 ~]# ansible web -m shell -a 'systemctl is-enabled vsftpd'
192.168.129.137 | FAILED | rc=1 >>
disablednon-zero return code
- 设置vsftpd服务开机自启
[root@192 ~]# ansible web -m service -a 'name=vsftpd enabled=yes'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
......此处省略N行
- 查看受控机上的vsftpd服务是否开机自启
[root@192 ~]# ansible web -m shell -a 'systemctl is-enabled vsftpd'
192.168.129.137 | CHANGED | rc=0 >>
enabled
- 重启vsftpd服务
[root@192 ~]# ansible web -m service -a 'name=vsftpd state=restarted'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
......此处省略N行
- 停止受控机上的vsftpd服务
[root@192 ~]# ansible web -m service -a 'name=vsftpd state=stopped'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
......此处省略N行
[root@192 ~]# ansible web -m shell -a 'systemctl is-active vsftpd'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | FAILED | rc=3 >>
inactivenon-zero return code
l、file模块
官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
参数 | 选项/默认值 | 释义 |
---|---|---|
dest/path/name(required) | 将数据复制到远程节点的路径信息 | |
group | 文件数据复制到远程主机,设置文件属组用户信息 | |
mod | 文件数据复制到远程主机,设置数据的权限 eg 0644 0755 | |
owner | 文件数据复制到远程主机,设置文件属主用户信息 | |
src | 指定将本地管理主机的什么数据信息进行远程复制 | |
state | absent | 将数据进行删除 |
= | directory | 创建一个空目录信息 |
= | file | 查看指定目录信息是否存在 |
= | touch | 创建一个空文件信息 |
= | hard/link | 创建链接文件 |
名称 | 含义 |
---|---|
state=absent | 删除文件或者目录 |
owner | 属主 |
group | 属组 |
set | 4777 属主特殊权限 2777 属组特殊权限 1777 执行特殊权限 7777 全部特殊权限 |
1、创建一个普通文件
[root@192 ~]# ansible web -m file -a 'path=/tmp/gool state=touch'
2、创建一个目录
[root@192 ~]# ansible web -m file -a 'path=/tmp/test state=directory'
3、查看
[root@192 ~]# ansible web -m shell -a 'ls /tmp'
192.168.129.137 | CHANGED | rc=0 >>
gool
test
4、删除文件
[root@192 ~]# ansible web -m file -a 'state=absent path=/tmp/gool'
5、删除目录
[root@192 ~]# ansible web -m file -a 'state=absent path=/tmp/test'
6、查看
[root@192 ~]# ansible web -m shell -a 'ls /tmp'
192.168.129.137 | CHANGED | rc=0 >>
7、创建一个软连接文件
[root@192 ~]# ansible web -m file -a 'state=link src=/tmp/goole path=/tmp/谷歌'
[root@shazi tmp]# ll
总用量 0
lrwxrwxrwx. 1 root root 10 7月 18 16:34 谷歌 -> /tmp/goole
-rw-r--r--. 1 root root 0 7月 18 16:33 goole
8、创建一个硬连接文件
[root@192 ~]# ansible web -m file -a 'state=hard src=/etc/passwd path=/tmp/passwd'
[root@shazi tmp]# ll
总用量 4
-rw-r--r--. 3 root root 2655 7月 18 15:29 passwd
[root@shazi etc]# ll /passwd
-rw-r--r--. 1 root root 2655 7月 18 15:29 /passwd
9、创建一个文件,并设置权限,属主,属组
//创建zzz用户
[root@192 ~]# ansible web -m user -a 'name=zzz uid=366 system=yes create_home=no shell=/sbin/nologin state=present'
[root@192 ~]# ansible web -m file -a 'state=touch path=/tmp/fiel.txt mode=744 owner=zzz group=zzz'
10、修改一个文件得权限,属主,属组
[root@192 ~]# ansible web -m file -a 'path=/tmp/goole mode=777'
[root@192 ~]# ansible web -m file -a 'path=/tmp/fiel.txt owner=root group=root'
11、修改一个文件得set位特殊权限
[root@192 ~]# ansible web -m file -a 'path=/tmp/goole mode=2777'
[root@192 ~]# ansible web -m shell -a 'ls -l /tmp/goole'
192.168.129.137 | CHANGED | rc=0 >>
-rwxrwsrwx. 1 root root 0 7月 18 16:33 /tmp/goole
12、若想同时改变目录及其中的子目录或字文件的属性,可以用recurse=yes参数实现
[root@192 ~]# ansible web -m file -a 'path=/tmp group=zzz recurse=yes'
[root@shazi tmp]# ll
总用量 4
lrwxrwxrwx. 1 root zzz 10 7月 18 16:34 谷歌 -> /tmp/goole
-rwxrwxrwx. 1 root zzz 0 7月 18 16:42 fiel.txt
-rwxrwxrwx. 1 root zzz 0 7月 18 16:33 goole
m、lineinfile模块
名称 | 含义 |
---|---|
regexp=’^ $’ | 正则匹配,匹配数字 |
path | 指定要操作的文件 |
line | 指定文本的内容 |
regexp | 使用正则表达式匹配对应的行 当替换文本时,如果有多行文本被匹配,只替换最后匹配的那一行 当删除文本时,如果有多行文本被匹配,那么这些行都会被删除 |
state | state的默认值为present state=absent时,表示删除文本 |
backrefs | 当没有根据匹配规则找到对应的行时不做任何更改,默认值为no 当 backrefs=yes,没有根据匹配规则找到对应的行,指定的文本内容添加 当backrefs=yes时,也可以向后引用regexp变量信息 |
insertafter | 将文本插入到指定的行之后,参数的值可以设定为EOF或者正则表达式 |
insertbefore | 将文本插入到指定的行之前,参数的值可以设定为BOF或者正则表达式 |
backup | 是否在修改文件前备份 |
create | 当要操作的文件不存在时,是否创建对应的文件 |
1、当要操作的文件不存在时,是否创建对应的文件
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="hello woorld" '
192.168.129.137 | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"msg": "Destination /tmp/fiel does not exist !",
"rc": 257
}
//create=yes当要操作的文件不存在时,创建对应的文件
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="hello woorld" create=yes'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"backup": "",
"changed": true,
"msg": "line added"
}
//查看
root@shazi tmp]# ll
总用量 8
-rw-r--r--. 1 root root 13 7月 18 17:26 fiel
-rw-r--r--. 1 root root 96 7月 18 17:26 fiel.txt
-rw-r--r--. 1 root root 0 7月 18 16:33 goole
2、将匹配到的含hello字符串的最后一行行替换为line中的字符串
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="Centos" regexp='hello' create=yes'
[root@shazi tmp]# cat fiel
linux
hello
world hello
helll
Centos
3、当 backrefs=yes,同时根据匹配规则找不到相应的行时,不对文件进行任何改变
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="hehe" regexp="jjyy" backrefs=yes'
4、^正则表达式
[root@192 ~]# ansible web -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled" '
[root@shazi selinux]# cat config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
5、在文件的开头插入line中的字符
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="shazi" insertbefore=BOF'
[root@shazi tmp]# cat fiel
shazi
linux
hello
6、在文件的结尾插入line中的字符
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="xxx" insertafter=EOF'
[root@shazi tmp]# cat fiel
shazi
linux
Centos
xxx
7、在含有hello字符的行前插入line中的字符
[root@192 ~]# ansible web -m lineinfile -a 'path=/tmp/fiel line="****" insertbefore="hello" '
[root@shazi tmp]# cat fiel
shazi
linux
****
hello
Centos
xxx
8、在含有hello字符的行后插入line中的字符
[root@192 ~]# ansible web -m insertafter -a 'path=/tmp/fiel line="%%%%" insertbefore="hello" '
[root@shazi tmp]# cat fiel
shazi
linux
****
hello
%%%%
Centos
xxx
n、blockinfile 模块
给文件中添加一段内容,并注明标志
1、添加
block='' 文档内容
marker='#{mark}' 标志信息
state 将指定文本"插入"到文件中
[root@192 ~]# ansible web -m blockinfile -a 'block="nginx" path=/tmp/fiel marker="#{mark} nginx"'
Enter passphrase for key '/root/.ssh/id_rsa':
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"msg": "Block inserted"
}
[root@shazi tmp]# cat fiel
#BEGIN nginx
nginx
#END nginx
2、在末尾添加
[root@192 ~]# ansible web -m blockinfile -a 'path=/tmp/fiel block="systemctl\start " '
[root@shazi tmp]# cat fiel
shazi
linux
# BEGIN ANSIBLE MANAGED BLOCK
systemctl\start
# END ANSIBLE MANAGED BLOCK
3、删除:
[root@192 ~]# ansible web -m blockinfile -a 'path=/tmp/fiel block="systemctl\start " state=absent'
[root@shazi tmp]# cat fiel
shazi
linux
o、cron模块
官方文档:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
参数 | 选项/默认值 | 释义 |
---|---|---|
minute/hour/day/month/weekday | 和设置时间信息相关参数 | |
job | 和设置定时任务相关参数 | |
name(required) | 设置定时任务注释信息 | |
state | absent | 删除指定定时任务 |
disabled | yes | 将指定定时任务进行注释 |
= | no | 取消注释 |
1、模块方法
1. backup:对远程主机上的原任务计划内容修改之前做备份
2. cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
3. day:日(1-31,*,*/2,……)
4. hour:小时(0-23,*,*/2,……)
5. minute:分钟(0-59,*,*/2,……)
6. month:月(1-12,*,*/2,……)
7. weekday:周(0-7,*,……)
8. job:要执行的任务,依赖于state=present
9. name:该任务的描述
10. special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
11. state:确认该任务计划是创建还是删除
12. user:以哪个用户的身份执行
2、示例:
- 添加定时任务
[root@192 ~]# ansible web -m cron -a 'name="test crontab" minute=5 hour=1 job="echo test"'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"envs": [],
"jobs": [
"test crontab"
]
}
[root@shazi tmp]# crontab -l
#Ansible: test crontab
5 1 * * * echo test
- 移除定时任务
[root@192 ~]# ansible web -m cron -a 'name="test crontab" minute=5 hour=1 job="echo test" state="absent"'
192.168.129.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"envs": [],
"jobs": []
}
p、unarchive 解压模块
- name: Unarchive a file that is already on the remote machine
unarchive:
src: /tmp/foo.zip #要解压的包
dest: /usr/local/bin #解压到目标位置
remote_src:
yes #要解压的包在受控端
no #要解压的包在控制端
示例:
#1.解压控制端的包到受控端
[root@m01 /package]# ansible web -m unarchive -a 'src=/package/php.tar.gz dest=/tmp/'
#2.解压受控端的包到受控端
[root@m01 /package]# ansible web -m unarchive -a 'src=/package/php.tar.gz dest=/tmp/ remote_src=yes'
q、archive 压缩模块
EXAMPLES:
- name: Compress directory /path/to/foo/ into /path/to/foo.tgz
archive:
path: /path/to/foo #要压缩的文件或目录
dest: /path/to/foo.tgz #压缩后的文件
format:bz2, gz, tar, xz, zip #指定打包的类型
示例:
#1.打包站点目录
[root@m01 /package]# ansible web01 -m archive -a 'path=/code dest=/tmp/code.tar.gz'
三、运维发布方式有哪些?
1、蓝绿部署
用于downtime应用上线时的一套部署策略 不停止老版,额外搞一套新版本,等测试发现新版本OK后,删除老版本。
斜体样式在部署新版本之前,需要将部署新版本的流量掐断,全部打到ok的老版本上。
缺点:需要有两倍的机器资源,得保持冗余的服务始终在线
优点:两个版本可能都可能组任何时间点获取流量
2、灰度发布(金丝线发布)
在不停止老版本的情况下,额外搞一套新版本,经常与A/B测试一起使用,用于测试选择多种方案
精确的流量分发控制
做监控
3、滚动发布
一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本
优点:比蓝绿部署节约资源
缺点:服务器节点数量多,会很慢
4、红黑部署
测试不通过,找到问题原因后,直接干掉新生成的服务器以及Autoscaling Group就可以,测试通过,则将ELB指向新的服务器集群,然后销毁掉旧的服务器集群以及AutoScaling Group
优点:服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线
缺点:在蓝绿色部署中,两个版本可能暂时同时获取请求,而在红黑中,只有一个版本在任何时间点获得流量