Ansible软件安装完就可以直接使用了,不像其他服务需要对主配置文件进行修改,唯一要调整的配置文件就是主机列表清单文件。
Ansible实现批量管理主机主要由两种模式,一种是利用ansible命令实现批量管理(ad-hoc模式),另一种是利用Ansible剧本实现批量管理(playbook模式).
ansible命令格式:ansible wangju -m command -a hostname
ansible格式说明:命令 主机组模块名 指定模块参数 模块名称 指定利用模块执行的动作参数 批量要执行的操作
模块名称有很多个,这里只需要介绍几个常用的:command(*)、shell(*)、script(*)、copy(*)、file、service、cron、yum、user、group、mount
Ansible自动化服务软件实现批量管理功能必须依靠ansible软件中的众多模块,因此只需要熟悉模块的使用,基本上就可以说对Ansible软件了解了一大半。
command模块功能说明:在远程节点上执行一个命令(用于执行一个命令)
command选项参数
chdir :在执行命令之前,通过cd命令进入指定的目录
creates:定义一个文件是否存在,如果不存在,则运行相应的命令,如果存在,则逃过此步骤
free_from(必有参数):参数信息中可以输入任何系统命令信息,实现远程管理
removes:定义一个文件是否存在,如果存在,则运行相应的命令,如果不存在,则逃过此步骤
利用command模块实现批量管理:获取所有主机的负载信息
[root@localhost ~]# ansible all -m command -a 'uptime' #注意在使用command模块的时候,不能带管道以及重定向符号
192.168.146.110 | CHANGED | rc=0 >>
10:53:35 up 6:13, 6 users, load average: 0.00, 0.01, 0.05
192.168.146.120 | CHANGED | rc=0 >>
10:53:42 up 4:25, 5 users, load average: 0.00, 0.01, 0.05
利用command模块实现批量管理:切换到/etc/目录
[root@localhost ~]# ansible all -m command -a "pwd chdir=/etc"
192.168.146.120 | CHANGED | rc=0 >>
/etc
192.168.146.110 | CHANGED | rc=0 >>
/etc
利用command模块实现批量管理:实践creates
[root@localhost ~]# ansible all -m command -a "pwd creates=/loving"
192.168.146.110 | SUCCESS | rc=0 >> #输出绿色的信息,是因为/loving 存在,所以没有执行pwd
skipped, since /loving exists
192.168.146.120 | CHANGED | rc=0 >> #输出黄色的信息,是因为/loving 不存在,执行了pwd
/root
利用command模块实现批量管理:removes实践
[root@localhost ~]# ansible all -m command -a "ls /opt removes=/opt"
192.168.146.120 | CHANGED | rc=0 >>
192.168.146.110 | CHANGED | rc=0 >> #存在,执行命令
hosts
[root@localhost ~]# ansible all -m command -a "ls /old removes=/old"
192.168.146.120 | SUCCESS | rc=0 >>
skipped, since /old does not exist #不存在,跳过
192.168.146.110 | SUCCESS | rc=0 >>
skipped, since /old does not exist
利用command模块实现批量管理:warn实践
warn=False 忽略警告的意思
[root@localhost ~]# ansible all -m command -a "chmod 000 /etc/hosts" #警告未忽略,下面是紫色的
[WARNING]: Consider using the file module with mode rather than running 'chmod'. 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.146.120 | CHANGED | rc=0 >>
192.168.146.110 | CHANGED | rc=0 >>
[root@localhost ~]# ansible all -m command -a "chmod 000 /etc/hosts warn=False" #忽略警告
192.168.146.120 | CHANGED | rc=0 >>
192.168.146.110 | CHANGED | rc=0 >>
shell模块功能说明
功能说明:在远程节点上执行命令(可以是多个命令)
chdir :在执行命令之前,通过cd命令进入指定的目录
creates:定义一个文件是否存在,如果不存在,则运行相应的命令,如果存在,则逃过此步骤
free_from(必有参数):参数信息中可以输入任何系统命令信息,实现远程管理
removes:定义一个文件是否存在,如果存在,则运行相应的命令,如果不存在,则逃过此步骤
批量执行ps -ef|grep sshd|grep -v grep 命令
[root@localhost ~]# ansible wangju -m shell -a "ps -ef|grep sshd|grep -v grep"
192.168.146.110 | CHANGED | rc=0 >>
root 1190 1 0 11:07 ? 00:00:00 /usr/sbin/sshd -D
root 23771 1190 0 16:44 ? 00:00:00 sshd: root@pts/3
root 25186 1190 0 17:37 ? 00:00:00 sshd: root@pts/4
root 26710 1190 10 19:41 ? 00:00:00 sshd: root@pts/1
批量执行的远程脚本
首先在被管理的主机web1上编写远程执行的脚本
[root@web1 ~]# echo pwd >/loving/pwd.sh
[root@web1 ~]# cat /loving/pwd.sh
pwd
[root@web1 ~]# chmod +x /loving/pwd.sh
在本地主机上运行批量管理的命令
[root@localhost ~]# ansible wangju -m shell -a "/loving/pwd.sh"
192.168.146.110 | CHANGED | rc=0 >>
/root
说明:利用shell模块实现批量执行远程主机脚本时,脚本必须在远程主机上存在,并且授权执行权限。
script模块功能说明
功能说明:把本地脚本传输到远程节点上并运行脚本,和shell模块相比,本地有一份脚本就可以在所有机器上执行。
creates:定义一个文件是否存在,如果不存在,则运行相应的命令,如果存在,则逃过此步骤
free_from(必有参数):参数信息中可以输入任何系统命令信息,实现远程管理
removes:定义一个文件是否存在,如果存在,则运行相应的命令,如果不存在,则逃过此步骤
批量执行远程脚本
[root@localhost ~]# mkdir -p /server/scripts #创建测试目录
[root@localhost ~]# echo -e "pwd\nhostname" >/server/scripts/pwd.sh #创建本地测试文本
[root@localhost ~]# cat /server/scripts/pwd.sh #查看测试文本
pwd
hostname
[root@localhost ~]# chmod +x /server/scripts/pwd.sh #赋予测试文本执行权限
[root@localhost ~]# ansible wangju -m script -a "/server/scripts/pwd.sh" #批量执行远程脚本
192.168.146.110 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.146.110 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.146.110 closed."
],
"stdout": "/root\r\nweb1\r\n",
"stdout_lines": [
"/root",
"web1"
]
}
说明:使用script模块实现批量执行远程主机脚本时,脚本不用在远程主机上存在和授权
Ansible文件类型模块介绍与实践
copy模块功能说明
功能说明:复制文件到远程主机
src:本地路径文件复制到远程服务器;可以是绝对路径,可以是相对路径。如果路径是一个目录,将会递归复制,在这种情况下,如果路径以”/” 结束,目录和目录下所有内容都会被复制,否则,如果不以“/” 结束,目录和目录下的所有的内容都会被复制。
dest(必有参数):文件应该被拷贝到的远程绝对路径信息,如果src是一个目录,dest也必须是目录
owner:定义所拥有的文件/目录的所属用户名称,类似chown 命令功能
group:定义所拥有的文件/目录的所属组名称,类似chown 命令功能
mode:定义文件或目录的权限信息,就像使用 /usr/bin/chmod 设定八进制数(如0644)权限一样,取消前导零可能会有令人意想不到的结果
backup:创建备份文件并且包含时间戳信息,以便能够还原文件,如在原文件被覆盖错误时。默认配置为no,并且配置指定信息为yes|no
content:当使用代替src参数时,将文件的内容直接设置为指定值。远端创建有指定内容文件,并且只能设置简单值。对于任何复杂或格式化内容,请切换到template模块
force:默认为yes,当远程文件内容和源文件内容不同时,将覆盖目标文件。如果为no,文件将只被传输,如在目标主机不存在此文件时
remote_src:如果为False,将搜索源信息在本地 / 管理及机器上;如果为True,将到远程 / 目标主机的机器上搜索。默认为false,目前remote_src不支持递归复制
说明:copy模块是远程推送数据模块,只能将数据推送到远程主机上,不能实现拉取数据到本地管理主机
批量远程复制文件
批量远程复制文件并设置用户、用户组、权限属性。
[root@localhost ~]# ansible wangju -m copy -a "src=/etc/passwd dest=/tmp/oldgirl.txt owner=user group=user mode=0755"
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "990fa46714239836e21f7374dd86880212a14e13",
"dest": "/tmp/oldgirl.txt",
"gid": 1000,
"group": "user",
"md5sum": "7c9dd79bc081589ca7f3f80f62b2c675",
"mode": "0755",
"owner": "user",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 2569,
"src": "/root/.ansible/tmp/ansible-tmp-1621431893.11-27704-63341040103486/source",
"state": "file",
"uid": 1000
}
[root@localhost ~]# ansible wangju -m command -a "ls -l /tmp/oldgirl.txt" #登录到远程主机查看批量操作的结果
192.168.146.110 | CHANGED | rc=0 >>
-rwxr-xr-x. 1 user user 2569 5月 19 21:44 /tmp/oldgirl.txt
远程批量复制文件前进行备份,并写入指定内容到文件
[root@localhost ~]# ansible wangju -m copy -a "content='i am wangju' dest=/tmp/oldgirl.txt backup=yes"
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/oldgirl.txt.28462.2021-05-19@21:51:31~",
"changed": true,
"checksum": "bc4f8fb29d1d4b01071fa83a7a9989b8687451b6",
"dest": "/tmp/oldgirl.txt",
"gid": 1000,
"group": "user",
"md5sum": "d21227243c1ce62f467bc3dd7ca7e976",
"mode": "0755",
"owner": "user",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1621432318.98-27866-81318773987130/source",
"state": "file",
"uid": 1000
}
[root@localhost ~]# ansible wangju -m command -a "cat /tmp/oldgirl.txt" #检查文件内容是否被修改,发现文件内容与前面的不一样了
192.168.146.110 | CHANGED | rc=0 >>
i am wangju
[root@localhost ~]# ansible wangju -m shell -a "ls /tmp/oldgirl.txt*" #注意这里只能使用shell模块,不能使用command,因为command模块儿不能与通配符匹配。
192.168.146.110 | CHANGED | rc=0 >>
/tmp/oldgirl.txt
/tmp/oldgirl.txt.28462.2021-05-19@21:51:31~
file模块儿功能说明
功能说明:创建及设置文件(目录)属性
src:要连接的文件路径(只能应用state=link),创建连接文件时使用
path(必有参数):文件路径管理:别名方式:dest,name
owner:定义所拥有的文件 / 目录的所属用户名称,类似chown命令功能
group:定义所拥有的文件 / 目录的所属组名称,类似chown命令功能
mode:定义文件或目录的权限信息,就像使用/usr/bin/chmod 设定八进制数(如0644)权限一样,取消前导零可能会有令人意想不到的结果
state:如果指定的参数为directory,所有不存在的子目录将会被创建,如果指定的参数为file,如果文件不存在,将不能被创建,如果想创建可以参考copy和template模块。如果指定的参数为link,符号连接将被创建或者更改;如果指定参数为hard,便会创建出硬链接,如果指定参数为absent,目录将被递归删除以及文件,而连接将被取消。请注意,定义的文件不存在不会失败,只是输出没有发生任何改变结果。如果指定参数为touch,如果路径不存在将会创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间。
说明:file模块主要用于创建文件或目录数据,以及对存在的文件或目录权限属性进行修改管理。
[root@localhost ~]# ansible all -m file -a "dest=/tmp/oldboy_dir state=directory" #创建目录信息
192.168.146.120 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/oldboy_dir",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/oldboy_dir",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@localhost ~]# ansible wangju -m file -a "dest=/tmp/oldboy_file owner=root group=user mode=777 state=touch" #创建文件信息
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/oldboy_file",
"gid": 1000,
"group": "user",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
[root@localhost ~]# ansible wangju -m file -a "src=/etc/hosts dest=/tmp/link_file state=link" #创建连接信息
192.168.146.110 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/link_file",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 10,
"src": "/etc/hosts",
"state": "link",
"uid": 0
}
[root@localhost ~]# ansible wangju -m shell -a "ls -l /tmp/" #登录到远程节点主机进行检查,发现我们创建的文件都能查到
192.168.146.110 | CHANGED | rc=0 >>
总用量 264
drwx------. 2 root root 41 5月 19 22:31 ansible_command_payload_OaHPFe
lrwxrwxrwx. 1 root root 10 5月 19 22:29 link_file -> /etc/hosts #新建的链接文件
drwxr-xr-x. 2 root root 6 5月 19 22:24 oldboy_dir #新建的目录
-rwxrwxrwx. 1 root user 0 5月 19 22:26 oldboy_file #新创建的文件
-rwxr-xr-x. 1 user user 11 5月 19 21:51 oldgirl.txt
-rwxr-xr-x. 1 user user 2569 5月 19 21:44 oldgirl.txt.28462.2021-05-19@21:51:31~
结束啦!!!