华子目录 Ansible四个命令模块 1.组成 2.特点 3.区别 3.1`command、shell`模块 3.2`raw`模块 4.`command`模块 5.`shell`模块 6.`script`模块 7.`raw`模块 文件操作模块
Ansible四个命令模块
1.组成
2.特点
应尽量避免使用这三个模块来执行命令,因为其他模块大部分都是幂等性的,可以自动进行更改跟踪。幂等性:输入相同,输出相同,无论多少次执行。比如说确认接口,如果传入订单号,返回确认ok,如果已经确认过了,再次调用确认接口,返回如果还是确认ok,那么这个接口就是满足幂等性command、shell、raw不具备幂等性
3.区别
3.1command、shell模块
相同点:要求受管主机上安装python 不同点:command可以在受管主机上执行Linux命令,但是不支持环境变量和操作符(例如'|' '<' '>' '&'),shell模块需要调用/bin/sh指令执行
3.2raw模块
不需要受管主机安装python,直接使用远程shell运行命令,通常用于无法安装python的系统(例如:网络设备等)
4.command模块
4.1参数表
名称 必选 备注 chdir no(不是必选参数) 运行command命令前先cd到这个目录 creates no 如果这个参数对应的文件存在,就不运行command free_form yes 需要执行的脚本(没有真正的参数为free_form) executable no 改变用来执行命令的shell,是可执行文件的绝对路径 removes no 如果这个参数对应的文件不存在,就不运行command,与creates参数作用相反 stdin no 2.4后的新增,将命令的stdin设置为指定的值
4.2free_form参数
必须参数,指定需要远程执行的命令。free_form 参数与其他参数(如果想要使用一个参数,那么则需要为这个参数赋值,也就是name=value模式)并不相同。如:需要在远程主机上执行 ls 命令时,错误写法:free_form=ls ,因为并没有任何参数的名字是 free_form,若要在远程主机中执行 ls 命令时,直接写成 ls 即可。因为 command 模块的作用是执行命令,所以任何一个可以在远程主机上执行的命令都可以被称为free_form 例:
[ root@server ~]
@all:| --@ungrouped:| | --node1.example.com| | --node2.example.com
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
node1.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
frp_0.56.0_linux_amd64
frp_0.56.0_linux_amd64.tar.gz
mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >> node1.example.com | CHANGED | rc = 0 >>
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >>
/root
node1.example.com | CHANGED | rc = 0 >>
/root
[ root@server ~]
node1.example.com | CHANGED | rc = 0 >> node2.example.com | CHANGED | rc = 0 >> [ root@node1 ~]
公共 文档 模板 下载 anaconda-ks.cfg file.ansible[ root@node2 ~]
公共 模板 视频 anaconda-ks.cfg file.ansible
[ root@server ~]
node1.example.com | SUCCESS | rc = 0 >>
skipped, since file.ansible existsDid not run command since 'file.ansible' exists
node2.example.com | SUCCESS | rc = 0 >>
skipped, since file.ansible existsDid not run command since 'file.ansible' exists
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
file.ansible
node1.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
file.ansible
frp_0.56.0_linux_amd64
frp_0.56.0_linux_amd64.tar.gz
mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
[ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
hello world > file.ansible
node2.example.com | CHANGED | rc = 0 >>
hello world > file.ansible
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >> node1.example.com | CHANGED | rc = 0 >> [ root@server ~]
node2.example.com | FAILED | rc = 2 >>
file.ansible/root:
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
file.ansiblels: 无法访问 '|' : 没有那个文件或目录
ls: 无法访问 'grep' : 没有那个文件或目录non-zero return code
node1.example.com | FAILED | rc = 2 >>
file.ansible/root:
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
file.ansible
frp_0.56.0_linux_amd64
frp_0.56.0_linux_amd64.tar.gz
mysql-8.0.37-linux-glibc2.17-x86_64.tar.xzls: 无法访问 '|' : 没有那个文件或目录
ls: 无法访问 'grep' : 没有那个文件或目录non-zero return code
5.shell模块
5.1作用
让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等,参数与command模块几乎相同,但在执行命令的时候调用的是/bin/sh
5.2例如
[ root@server ~]
node2.example.com | CHANGED | rc = 0 >>
.
├── 公共
├── 模板
├── 视频
├── 图片
├── 文档
├── 下载
├── 音乐
├── 桌面
├── anaconda-ks.cfg
└── file.ansible8 directories, 2 files
node1.example.com | CHANGED | rc = 0 >>
.
├── 公共
├── 模板
├── 视频
├── 图片
├── 文档
├── 下载
├── 音乐
├── 桌面
├── anaconda-ks.cfg
├── file.ansible
├── frp_0.56.0_linux_amd64
│ ├── frpc
│ ├── frpc.toml
│ └── LICENSE
├── frp_0.56.0_linux_amd64.tar.gz
└── mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz9 directories, 7 files
[ root@server ~]
node1.example.com | CHANGED | rc = 0 >> [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
hello world
6.script模块
script 与shell 类似,都可以执行脚本区别:script执行的脚本在ansible管理机上,而shell执行的脚本必须先放到目标节点上去,才能执行shell执行可以使用环境变量,bash等,但是script只是执行.sh脚本,不能带 bash
6.1示例
[ root@server ~]
echo "hello world" [ root@server ~]
node2.example.com | CHANGED = > { "changed" : true,"rc" : 0 ,"stderr" : "Shared connection to node2.example.com closed.\r \n " ,"stderr_lines" : [ "Shared connection to node2.example.com closed." ] ,"stdout" : "hello world\r \n " ,"stdout_lines" : [ "hello world" ]
}
node1.example.com | CHANGED = > { "changed" : true,"rc" : 0 ,"stderr" : "Shared connection to node1.example.com closed.\r \n " ,"stderr_lines" : [ "Shared connection to node1.example.com closed." ] ,"stdout" : "hello world\r \n " ,"stdout_lines" : [ "hello world" ]
}
[ root@node1 ~]
echo "hello world" [ root@node2 ~]
echo "hello world" [ root@server ~]
node2.example.com | CHANGED | rc = 0 >>
hello world
node1.example.com | CHANGED | rc = 0 >>
hello world
7.raw模块
raw模块主要用于执行一些低级的命令,一般适用于下列两种场景
第一种:在较老的(python2.4和之前的版本)主机上执行命令第二种:对任何没有安装python的设备(如路由器)注意:在任何其他情况下,使用shell或command模块更为合适
7.1参数
名称 必选 备注 executable no(可以不选) 改变用来执行命令的shell,是可执行文件的绝对路径 free_form yes 需要执行的脚本(没有真正的参数为free_form)
7.2示例
[ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
/root
Shared connection to node1.example.com closed.node2.example.com | CHANGED | rc = 0 >>
/root
Shared connection to node2.example.com closed.
[ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
hello world
Shared connection to node1.example.com closed.node2.example.com | CHANGED | rc = 0 >>
hello world
Shared connection to node2.example.com closed.
文件操作模块
1.file模块
作用:实现对文件的基本操作,如:创建目录或文件,删除目录或文件,修改文件权限等
1.1参数
path:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以state: 格式:path=“路径” state= touch | directory | link | hard | absent此参数使用灵活,如:在远程主机中创建一个目录,则使用path参数指定对应的目录路径,假设在远程主机上创建/testdir/a/b目录,则设置路径:path=/testdir/a/b,但ansible无法从/testdir/a/b这个路径看出b是一个文件还是一个目录,所以需要通过state参数进行说明
参数 值 含义 state=absent删除远程机器上的指定文件或目录state=directory创建一个空目录state=file查看指定目录是否存在state=touch创建一个空文件state=hard/link创建链接文件
src:当state设置为link或者hard时,表示创建一个软链或硬链,则必须通过指明src参数即可指定链接源
force : 当state=link的时,使用force=yes 参数表示强制创建链接文件,该文件分为三种情况:
当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件 当存储目录中已经存在与链接文件同名的文件时,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件 当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件 owner:用于指定被操作文件的属主信息,属主对应的用户必须在远程主机中存在,否则会报错
group:用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错
mode:用于指定被操作文件的权限,如:
要将文件权限设置为: “rw-r-x---”,则可以使用mode=650进行设置,或者使用mode=0650 要设置特殊权限,如:为二进制文件设置suid,则可以使用mode=4700 recurse:当要操作的文件为目录时,recurse设置为yes可以递归的修改目录中文件的属性和权限
1.2示例
在所有远程主机上创建一个名为 data的目录,如果存在则不做操作
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"gid" : 0 ,"group" : "root" ,"mode" : "0755" ,"owner" : "root" ,"path" : "/root/data" ,"size" : 6 ,"state" : "directory" ,"uid" : 0
}
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"gid" : 0 ,"group" : "root" ,"mode" : "0755" ,"owner" : "root" ,"path" : "/root/data" ,"size" : 6 ,"state" : "directory" ,"uid" : 0
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
data
file.ansible
frp_0.56.0_linux_amd64
frp_0.56.0_linux_amd64.tar.gz
mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
t2.sh
node2.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
data
file.ansible
t2.sh
在node1主机上创建一个名为testfile1的文件,如果testfile1文件已经存在,则会更新文件的时间戳,与touch命令的作用相同
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/data/testfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "root" ,"size" : 0 ,"state" : "file" ,"uid" : 0
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
file1
testfile1
在node1上为testfile1文件创建软链接文件,软链接名为linkfile1
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/data/linkfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0777" ,"owner" : "root" ,"size" : 20 ,"src" : "/root/data/testfile1" ,"state" : "link" ,"uid" : 0
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
file1
linkfile1
testfile1
在node1上为 testfile1 文件创建硬链接文件,硬链接名为 hardfile1(类似于复制)
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/data/hardfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "root" ,"size" : 0 ,"src" : "/root/data/testfile1" ,"state" : "hard" ,"uid" : 0
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
file1
hardfile1
linkfile1
testfile1
在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释
[ root@server ~]
[ WARNING] : Cannot set fs attributes on a non-existent symlink target. follow should be
set to False to avoid this.
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/data/linkfile3" ,"src" : "/root/data/123"
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
file1
hardfile1
linkfile1
linkfile3
testfile1
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"path" : "/root/data" ,"state" : "absent"
} [ root@server ~]
node1.example.com | CHANGED | rc = 0 >>
公共
模板
视频
图片
文档
下载
音乐
桌面
anaconda-ks.cfg
file.ansible
frp_0.56.0_linux_amd64
frp_0.56.0_linux_amd64.tar.gz
mysql-8.0.37-linux-glibc2.17-x86_64.tar.xz
t2.sh
创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主
[ root@server ~]
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
}
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
} [ root@server ~]
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile2" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "root" ,"size" : 0 ,"state" : "file" ,"uid" : 0
}
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile2" ,"gid" : 0 ,"group" : "root" ,"mode" : "0644" ,"owner" : "root" ,"size" : 0 ,"state" : "file" ,"uid" : 0
}
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile2" ,"gid" : 1000 ,"group" : "redhat" ,"mode" : "0644" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
}
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile2" ,"gid" : 1000 ,"group" : "redhat" ,"mode" : "0644" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
}
创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限
[ root@server ~]
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0777" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
}
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"dest" : "/root/testfile1" ,"gid" : 0 ,"group" : "root" ,"mode" : "0777" ,"owner" : "redhat" ,"size" : 0 ,"state" : "file" ,"uid" : 1000
}
递归方式将目录中的文件的属主属组都设置为redhat
[ root@server ~]
node2.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"gid" : 1000 ,"group" : "redhat" ,"mode" : "0755" ,"owner" : "redhat" ,"path" : "/data/test/demo" ,"size" : 6 ,"state" : "directory" ,"uid" : 1000
}
node1.example.com | CHANGED = > { "ansible_facts" : { "discovered_interpreter_python" : "/usr/bin/python3" } ,"changed" : true,"gid" : 1000 ,"group" : "redhat" ,"mode" : "0755" ,"owner" : "redhat" ,"path" : "/data/test/demo" ,"size" : 6 ,"state" : "directory" ,"uid" : 1000
} [ root@node1 ~]
总用量 0
drwxr-xr-x 2 redhat redhat 6 7 月 7 22 :15 demo[ root@node2 ~]
总用量 0
drwxr-xr-x 2 redhat redhat 6 7 月 7 22 :15 demo
2.copy模块
作用:拷贝文件,将ansible主机上的文件拷贝到远程受控主机中
2.1参数
参数 默认值 含义 src 用于指定需要copy的文件或目录 backup no,yes 当远程主机的目标路径中已存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,设为yes时,会先备份远程主机中的文件,然后再拷贝到远程主机 content 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错 dest 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数 group 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错 owner 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报 mode 错文指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r–r–",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示 force no,yes 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变