栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Ansible 常见模块及使用方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ansible 常见模块及使用方法

目录

1.支持的模块

2.获取模块的帮助

3. 三个远程命令模块的区别

1)command

2)shell 模块

3)script 模块

4.copy 模块

copy模块应用案例

5.file模块

file 模块用于例子

6.ping模块 

7.yum模块

yum模块应用例子

 8.service 模块

Service 模块例子

9.user模块

user模块案例

 10.group 模块

group 模块案例

11. fetch 模块


1.查看支持的模块
ansible-doc -l (小写 l)
ansible-doc -l | wc -l   #查看支持的模块个数
ansible --version   #查看 ansible 版本号

2.获取模块的帮助

格式: ansible-doc 模块名 或者ansible-doc -s 模块名     #获取指定模块帮助信息说明

这里我使用ansible-doc获取下command模块的使用方式

ansible-doc command
ansible-doc -s command

按q退出

3. 三个远程命令模块的区别

1)command

command模块可以帮助我们在远程主机执行命令

注意:使用 command模块在远程主机执行命令时,不会经过被连接端的 shell 解释器处理 ,

使用 command 模块执行命令时,执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”    “|”   “;” 和 “&”,如想使用特殊符号可使用 shell 模块 。

在执行 ansible 时,不加 -m 默认使用 command,可以在/etc/ansible/ansible.cfg 中修改。

#module_name = command

缺点:不支持管道等特殊号,没法批量执行命令;

 例:查看 web_server 组里主机里网卡信息

 ansible web_server -m command -a 'ip addr show dev ens33' #缩写就是 ip a 命令

2)shell 模块

 shell 模块也可以帮助我们在远程主机执行命令,与 command模块不同的是,shell模块在执行命令时,会经过远程主机上的/bin/sh程序处理,shell模块支持管道与重定向等符号,在终端输入的各种命令方式,都可以使用

使用shell模块查看 web_server组内存

ansible -i /etc/ansible/hosts web_server -m shell -a 'free -m | grep "Mem"'

 注:我们自己定义在/etc/profile或~/.bash_profile中的环境变量,shell 模块由于没有加载,无法识别,如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句

对 shell 模块的使用可以分为两块:

1) 如果待执行的语句少,可以直接写在一句话中:

 例如:在 192.168.1.12上部署 java 环境

tar zxf jdk-8u171-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
source /etc/profile

在 ansible 查看 jdk 的版本:

ansible nginx01 -m shell -a "java -version"

失败的原因是不能加载 /etc/profile中定义的java环境变量

 ansible nginx01 -m shell -a "source /etc/profile && java -version"

2)通过shell脚本执行脚本

利用shell 执行脚本,需一下几个步骤:

一:编写一个脚本

二:将脚本发送到远程主机

三:将脚本权限进行修改(添加执行权限)

四:运行ansible命令执行脚本

第一个步骤编写一个脚本:

例如:执行检查磁盘脚本,内容如下:

vim disk_check.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
echo $basedir
diskmax=10 # 磁盘的阈值

function check_max(){
   local disk_size=$1
   if [ $disk_size -ge $diskmax ]
   then
      echo "unhealth"
   else
      echo "health"
   fi
}

function check_disk_info(){
   df -h | grep "^/dev" | grep -v "/dev/sr0" | awk '{print $1,$5}' | cut -d '%' -f 1 | while read disk_name disk_size  
   do
        echo ""
        echo "disk_name=$disk_name,disk_size=$disk_size%"
        check_max $disk_size
   done
}
check_disk_info

说明:

dirname命令可以取给定路径的目录部分,把最后的要查询的文件部分前的路径取出,这个命令很少直接在shell命令行中使用,一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去

例如: dirname /etc/ansible/hosts 

 第二个步骤:将脚本发送到远程主机:

拷贝脚本之前,先在远程上创建好准备拷贝过去的文件目录 ,其中远程创建文件目录有两种方式

方式一:shell命令方式

ansible nginx01  -m shell -a "mkdir -p /work/ansible"

 方式二:file 模块执行创建文件夹

ansible nginx01 -m file -a "path=/work/file state=directory mode=700"

本环境采用方式一

第三个步骤: 将脚本发送到远程主机并将脚本权限进行修改(添加执行权限),批量拷贝 shell脚本到各台服务器

ansible 主机组 -m copy -a "src=拷贝的文件路径 dest=拷贝目标文件路径 mode=0755 

 ansible web_server -m copy -a "src=/root/disk_check.sh dest=/work/ansible mode=755"

说明:

 copy模块:实现主控制端向目标主机 copy文件

#src 主控端文件位置

#dest 被控端目标位置

#owner 文件复制过去后的所有者

#group 文件复制过去后的所属组

#mode  文件的权限设定(例如:755或0755都可以)

第四个步骤: 运行ansible命令执行脚本

ansible web_server -m shell -a "/work/ansible/disk_check.sh"

ansible web_server -m shell -a "/work/ansible/disk_check.sh"

总结:

1.command模块和shell模块的区别时: shell模块支持“管道符”等及脚本。

2.shell模块在远程执行脚本,在 ansible 管理端写一个脚本,在通过 copy模块传到远端,在执行

但这样就涉及到两次ansible调用,我们可以使用 scipt模块

3)script 模块

script 模块只能执行脚本,不能调用其他指令,但是script执行的是存放在ansbile管理端上的脚本

只需两步:

1.编写脚本

2. 在 ansible 命令执行脚本

在被管理节点上将之前 copy过来的脚本删除,方便测试 script 模块执行脚本

ansible web_server -a "rm -rf /work/ansible/*"

 测试script模块执行脚本:

ansible -i /etc/ansible/hosts web_server -m script -a "/root/disk_check.sh"

 总结:script和shell的区别是一个执行控制端的脚本,一个执行远程端的脚本。

4.copy 模块

实现主控制端向目标主机拷贝文件或目录,类似 scp 功能

copy模块常用选项:

backup:在覆盖之前将原文件备份,备份文件包含时间信息,有两个选项:yes | no

content:用于替代 ”src“,可以直接设定指定文件的值

dest:必选项,要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

directory_mode: 递归设定目录的权限,默认为系统默认权限

force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

src:要复制到远程主机的文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制,路径使用 "/"来结尾,则只复制目录里的内容,没有使用"/"来结尾,则包含目录在内的整个内容全部复制

copy模块应用案例

例1:使用 src,把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下

ansible web_server -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root group=root mode=640 backup=yes'

说明:

src 控制端文件位置

dest 被控制端目标位置

owner 文件复制过去的所有者

group 文件复制过去的属组

mode 文件的权限设定

backup=yes 如目标位置存在同名的文件,在覆盖前将原文件备份

192.168.1.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true,  #是否对目标主机信息进行改变
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
    "dest": "/tmp/hosts",  #显示目标路径信息
    "gid": 0,    #复制后的文件gid信息
    "group": "root",   #显示复制后文件属组信息
    "md5sum": "54fb6627dbaa37721048e4549db3224d",  #hosts文件的md5值
    "mode": "0640",   #显示复制后文件的权限信息
    "owner": "root",   #显示复制后文件的属主信息
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 158,    #显示复制后文件的大小信息
    "src": "/root/.ansible/tmp/ansible-tmp-1571668045.65-135407232805638/source", 
    "state": "file",   #显示当前操作的是一个文件
    "uid": 0   #显示复制后文件uid信息
}

查看主机是否复制成功

ansible web_server -m shell -a "ls -l /tmp/hosts"

 例2:使用 content:

ansible web_server -m copy -a 'content="Hello ansiblenyou are clever!n" dest=/tmp/ansible.txt'

查看目标主机结果:

 

5.file模块

 file模块主要用于远程主机上的文件操作,如修改文件属性(权限、属主、属组)和创建文件、目录、符号连接等,file 模块包含以下选项:

force:强制创建软连接,一种是源文件不存在但之后会建立的情况下,另一种是目标软连接已存在,有两个选项:yes|no

group:定义文件或目录的属组

mode:定义文件或目录的权限

owner:定义文件或目录的属主

recurse:递归的设置文件属性,只对目录有效

path:必选项,定义文件或目录的路径

src:要被链接的源文件的路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state:

state模块里的值

        directory:如果目录不存在,创建目录

        file:    不是用于创建文件,而是检查文件是否存在

        link:创建软链接

        hard:创建硬链接

         touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

        absent:删除目录、文件或者取消链接文件

file 模块用于例子

例1:修改 ngixn01,nginx02 上/tmp/hosts文件权限为777

查看文件权限

 例2:将 nginx01,nginx02上的/tmp/hosts文件创建符号链接到/opt目录下 

 查看创建的符号连接

 删除链接文件

ansible web_server -m file -a "path=/opt/hosts state=absent"

 例3:创建文件或目录

 创建目录。如果它不存在

ansible web_server -m file -a "path=/tmp/dir1 state=directory"

touch 创建空文件

ansible web_server -m file -a "path=/tmp/dir1/xaiolu state=touch"

6.ping模块 

测试连接可通性,没有参数。 连接存活返回 pong 值 

ansible web_server -m ping

7.yum模块

yum模块可以帮助我们在远程主机上通过yum源管理软件包

常用参数:

name参数:必须参数,用于指定需要管理的软件包,比如 nginx

state 参数:用于指定软件包状态,默认值为present,表示确保软件包已经安装,其他可用值有

installed、latest、absent、removed,其中installd与present等效,latest表示安装yum 最新版本,

absent 和 removed 等效,表示删除对应的软件包

disable_cache 参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置yes 表示禁用验证,即不验证包,直接安装

update_cache 参数:是否更新缓存,默认值为 no

eanblerepo 参数:用于指定安装软件包时临时启用 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源

disablerepo 参数:用于指定安装软件包时临时禁用的yum源。比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包

enablerepo 参数和 disablerepo 参数可以同时使用

yum模块应用例子

nginx01,nginx02 两台主机安装 httpd 软件(两台主机需要配置 repo 文件,指向yum源):

 ansible web_server -m yum -a "name=httpd state=latest"

目标主机验证

 

 8.service 模块

Ansible service 模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等

service模块详解:

name参数:此参数用于指定需要操作的服务名称,比如 ngixn,httpd

state 参数:此参数用于指定服务的状态,启动远程主机中的httpd,可以将 state的值设置为 started;如果想要停止远程主机中的服务,则可以将 state的值设置为 stopped;还有其他值:started、stopped、restarted(重启)、reloaded

enabled 参数:此参数用于指定是否将服务设置为开机自启,设置为 yes 表示将对应的服务设置为开机自启动,设置为 no 表示不会开机启动

runlevel 参数:服务启动级别

arguments 参数:服务命令行参数传递

注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭

Service 模块例子

启动 httpd 服务并设置为开机自启

 ansible web_server -m server -m service -a "enabled=yes name=httpd state=started"

重启 httpd 服务器

ansible web_server -m service -a "name=httpd state=restarted"

查看httpd 状态

ansible web_server -m shell -a "ps -ef | grep httpd"

或者

#centOS7.x

 ansible web_servers -a "systemctl status httpd"
ansible web_servers -a "systemctl is-enabled httpd"

#centOS7.x之前

ansible web_servers -a "service httpd status "
ansible web_servers -a "chkconfig --list httpd"

9.user模块

user模块可以帮助我们管理远程主机上的用户,如创建用户、修改用户、删除用户、为用户创建密钥对等操作

常用参数:

name 参数:必须参数,用于指定要操作的用户名称

group 参数: 此参数用于指定用户所在的基本组

groups 参数:此参数用于指定用户所在附加组,注意:如果用户已经存在并且已经拥有多个附加组,如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖

append 参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,默认会覆盖原来的附加组设置,如不想覆盖,结合 append 参数, 将 append 设置为 yes,表示追加到现有的附加组设置,append 默认值为 no

shell 参数:用于指定用户的默认shell

uid 参数:此参数用于指定用户的 uid 号

expires 参数:此参数用于指定用户的过期时间,存在/etc/shadow 文件中的第8列

comment参数 :用于指定用户的注释信息

state 参数: 用于指定用户是否存在于远程主机中,可选值有 present 、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户

remove 参数:当state 的值设置为 absent时,表示要删除远程主机中的用户,不会删除用户的家目录等信息,remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录

password 参数:指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串

 输入上述命令后,即可得到明文密码123456对应的加密字符串。CTRL+D退出 python

update_password参数:当此参数的值设置为always 时表示,直接更新用户的密码,默认值即为 always,但是当此参数设置为 on_create 时,on_create只为新用户设置密码

generate_ssh_key参数:参数默认值为 no,如果设置为 yes,表示为对应的用户生成 ssh 密钥对,默认在用户家目录的 ./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作)

user模块案例

例1:创建用户 berry,登录 shell 为/sbin/nologin

 ansible web_server -m user -a "name=berry shell=/sbin/nologin state=present"
ansible web_server -m shell -a 'grep "berry" /etc/passwd'

例2:删除刚才创建的用户 berry 及其宿主目录 

ansible web_server -m user -a "name=berry remove=yes state=absent"

查看 berry 用户是否删除

注:注意该用户下不能有任何进程,否则会报错如下红色部分

 例3:创建一个用户,指定用户密码

ansible web_server -m user -a 'name=testops password=$6$7Z1vkI4fbXUTWAqg$9sLsjuEF2PlBve1J95lOE/D06IbAzTOvs6bQH4/yeMcdd2IrNIDgJMP5J2PWN2wCmQg3dq7yJ.Le7A/i2lSTF/' 

passwd使用之前生成的密文

查看测试:

我们可以看到被管理主机已创建用户"testops",并且密码为密文已写入"/etc/shadow"用户文件中,尝试用ssh命令使用testops用户登录被管理主机,登录成功

ansible web_server -m shell -a 'grep "testops" /etc/passwd'
ssh testops@192.168.1.12

 10.group 模块

group 模块帮助我们管理远程主机的组

常用参数

name参数: 必须参数,用于指定要操作的组名称

state 参数: 用于指定组的状态,两个值可选,present,absent,默认为 present设置为absent 表示删除组

gid 参数: 用于指定组的 gid

group 模块案例

例1:在 nginx01 nginx02 主机中创建名为testgroup的组

ansible web_server -m group -a "name=testgroup"

例2:删除 nginx01 nginx02 主机名存在名为 testgroup的组

 ansible web_server -m group -a "name=testgroup state=absent"

删除成功的前提是不能有用户把被删除的组当成基本组。会报如下错误:

11. fetch 模块

 从远程主机拉取文件到本地

示例:从 nginx01 主机拉取文件 /etc/hosts 到ansible本地的/tmp目录

ansible nginx01 -m fetch -a "src=/etc/hosts dest=/tmp"

 说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径.

以上是常用模块,至于其他模块的使用可通过官方模块列表获得:

https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/986137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号