柴少的官方网站 技术在学习中进步,水平在分享中升华

ansible的常用模块(三)

前面已经对ansible进行了简单的叙述,下面说ansible的一些常用模块使用。

首先我们已经做好了192.168.1.108到其他主机的秘钥权限认证,然后也设置了主机组,如下:

[root@master ~]# cat /etc/ansible/hosts       

[webservers]

192.168.1.112

192.168.1.113

[dbservers]

192.168.1.109

192.168.1.111

[masterhost]

192.168.1.108


博文来自:www.51niux.com

一、 ansible的常用模块

1.1 command命令模块

# ansible-doc -s command (简单命令可以,执行的命令中有管道或者变量,就需要使用shell模块了,参数解释一致。)

chdir : 在执行命令之前,先切换到该目录
creates : 一个文件名,当这个文件存在,则该命令不执行
executable : 切换shell来执行命令,需要使用命令的绝对路径
free_form= : 要执行的Linux指令,一般使用Ansible的-a参数代替。
removes : 一个文件名,这个文件不存在,则该命令不执行

[root@master ~]# ansible all -m command -a "mkdir /opt/scripts"  #指定所有的节点去制定一条命令,命令用引号括起来。

blob.png

#此图有成功后的效果图

1.2. copy模块

相关选项如下:

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

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

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

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

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

group:应该拥有文件/目录的组的名称,将被馈送到`chown'

mode:模式的文件或目录应该是,如0644将被馈送到`chmod'

owner:应该拥有文件/目录的用户的名称,将被馈送到`chown'

recurse :复制源目录中的所有内容。 这将与“同步”模块相比稍微低效,不应该被使用。

others:所有的file模块里的选项都可以在这里使用

src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

[root@master ~]# ansible all -m copy -a 'src=/root/3.sh dest=/opt/scripts' #指定所有节点,使用copy模块,原地址为本机的/root/3.sh,目标地址为/opt/scripts/

blob.png

#此为一个节点成功的截图

[root@master opt]#  ansible 192.168.1.109 -m copy -a "src=/opt/rsync dest=/opt/scripts/  mode=0400 force=yes"  #复杂一点就是加上授权以及强制复制更新,文件的权限为400,这样rsync目录就被拷贝到对端服务器的/opt/scripts下面了。

1.3. file模块

# ansible-doc -s file

force #强制执行
group #设置文件的属组
mode  #设置文件的权限
owner #设置文件的属主
path= #被管理文件的路径。别名:'dest','name'
recurse #递归设置指定的文件属性(仅适用于state =目录)
src  #链接到的文件的路径(仅适用于“state = link”)。将接受绝对的,相对的和不存在的路径。相对路径未扩展。
state    #file代表拷贝后是文件;link代表最终是个软链接;directory代表文件夹;hard代表硬链接;touch代表生成一个空文件;absent代表删除

[root@master opt]# ansible 192.168.1.109 -m file -a "dest=/opt/scripts/rsync/mimadir/iplist mode=755 owner=root group=root " 将iplist的权限设置为755,用户为root,所属组为root。

那如果我们不仅只想修改一个文件的权限,而是想把某个目录下的文件权限都修改如何做呢?

[root@master opt]# ansible 192.168.1.109 -m file -a "dest=/opt/scripts/rsync/mimadir/ mode=755 owner=root group=root recurse=yes" #recurse=yes参数就是当文件为目录时,进行递归设置权限

blob.png

#有此图查看这两次设置的变化。

 ansible all -m file -a "dest=~/tests mode=700 owner=root group=root state=directory"  #创建一个属主为root,属组为root,权限为700,在家目录下面,建一个名称为tests的目录。state的状态为directory/touch为创建目录。

[root@master ~]# ansible all -m file -a "dest=~/tests mode=755" #修改~/tests的目录权限为755,当然dest可以换成path,如:ansible all -m file -a "path=~/tests mode=744"  

[root@master ~]# ansible all -m file -a "dest=~/tests state=absent" #state=absent为删除指定的目录或文件

[root@master ~]# ansible all -m file -a "src=~/tests dest=/tmp/tests owner=root state=link" #state为link时为创建软链接

博文来自:www.51niux.com

1.4. yum或apt(utunbu系统下)模块

[root@master ~]# ansible all -m yum -a "state=present name=lrzsz"   #state如果是resent就是安装软件,如果是latest就是更新软件,如果是absent就是删除软件,name后面跟的是要安装软件的名称

[root@master ~]# ansible all -m yum -a "state=present name=lrzsz,gcc,gcc-c++"  #如果同时安装多个软件用,隔开,安装一个软件组:name="@Development tools",升级所有软件:name=*

blob.png

1.5. service模块

[root@master ~]# ansible all -m service -a "name=httpd enabled=yes" #将httpd添加到开机启动项,如果enabled=no就是将httpd服务从开机启动项目里面移除出来。

[root@master ~]# ansible all -m service -a "name=httpd state=stopped " #state有下面几种状态,restarted重启,started开启,reloaded重新加载,stopped关闭。

[root@master ~]# ansible all -m service -a "name=httpd state=restarted sleep=10" #sleep后面跟秒数,表示关闭服务之后停止多少秒之后再重新启动服务。

1.6. cron模块

# ansible-doc -s cron

backup #如果yes,那么在修改之后会进行备份,备份的路径在backup_file
cron_file #如果指定,请在cron.d中使用此文件,而不是单个用户的crontab。
day   #工作应该运行的月份的第几天(1-31,*,*/2等)
hour  #工作应该运行的小时(0-23,*,* / 2等)
job   #执行命令。 如果state =present则为必需。
minute #工作应该运行一分钟(0-59,*,*/2等)
month  #工作应该运行的一个月(1-12,*,*/2等)
name  #crontab条目的说明。
state #present(不存在就添加,存在如果是注释状态就取消状态启动此定时任务),absent为删除定时任务
user  #crontab应该修改的具体用户。
weekday #工作应该运行的星期几(周六至周六为0-6)

[root@master ~]# ansible all -m cron -a 'name="uptime job" minute=*/3 user=test job="/usr/sbin/ntpdate 0.centos.pool.ntp.org"'#name为定时任务的名称也就是定时任务的注释,minute为分钟,hour=为小时,day=为天,month为月,weekday为星期,他们默认都为*,user=用户名称的意思为制定将定时任务添加到哪个用户的定时任务中去,job=""里面的内容为定时任务的内容。下面看下执行后的截图:

blob.png

1.7. script模块

# ansible-doc -s script

creates:一个文件名,当这个文件存在,则该命令不执行
free_form= :本地脚本路径
removes : removes

# ansible all -m script -a "/root/random.sh" #只要控制节点上面存在这个脚本就可以,被执行端上面无需有此脚本,一样可以运行此脚本。

1.8. user模块

# ansible-doc -s user

append : 如果是yes,就是给这个用户添加一个组
comment:可选择地设置用户帐户的描述(也称为“GECOS”)。
createhome :除非设置为“no”,否则当创建帐户或主目录不存在时,将为用户创建主目录。
force : 当与`state = absent'一起使用时,行为与`userdel --force'一样。
generate_ssh_key : 为yes时,生成秘钥对。生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相同,不会生成authorized_keys文件。
group:设置用户主组,后面跟用户组名称
groups:设置多个组,当设置为'groups='的时候,用户将从主组以外的所有组移除
home:可以选择设置用户的主目录。
move_home :如果与“home =”一起使用时设置为“yes”,则尝试将用户的主目录移动到指定的目录(如果尚未存在)。
name= :创建,删除或修改用户的名称。
non_unique :可选地,当与-u选项一起使用时,该选项允许将用户ID更改为非唯一值。
password:(可选)将用户密码设置为此加密值。
remove:当与`state = absent'一起使用时,行为与`userdel --remove'一样。
shell:可选择地设置用户的shell。
ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
ssh_key_comment:(可选)定义SSH密钥的注释。
ssh_key_file :(可选)指定SSH密钥文件名。
ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
ssh_key_type:(可选)指定要生成的SSH密钥的类型。 可用的SSH密钥类型将取决于目标主机上的实现。
state : 帐户是否应该存在 当“absent”时,删除用户帐户。
system : 创建帐户时,将其设置为“yes”将使用户成为系统帐户。 现有用户无法更改此设置。
uid : 可选择地设置用户的“UID”。
update_password : 如果不同,“always”会更新密码。 ‘on_create'只会为新创建的用户设置密码。
#  ansible 192.168.1.109 -m user -a 'name=test2 uid=8001  password=$6$51niux$cuJ5LteLgT/M5ZGO6G1.oj/UEpKV3Hm7bR4dOdjxa5zGJLyZxmgCkKHydu/tqb67EkAA7UoggEJwlsuqP8eH71 state=present'

#name为用户的名称,uid为用户的uid,group为用户属于哪个组,home为用户的家目录,password为用户的密码这里只能是加密过得密码因为这个密码要直接写到/etc/shadow文件中去,state表示用户的状态present为应存在。shell=/sbin/nologin' ,设置了不能登录。当然如果想让这个用户登录就不要设置这个字段。

#linux的用户的密码是通过sha512加密生成的,下面只介绍一种生成方式:

# perl -e 'print crypt("51niux.com","\$6\$51niux\$") . "\n"'  #这里密码是51niux.com,然后又加了个51niux的盐,当然你可以随机加盐
$6$51niux$cuJ5LteLgT/M5ZGO6G1.oj/UEpKV3Hm7bR4dOdjxa5zGJLyZxmgCkKHydu/tqb67EkAA7UoggEJwlsuqP8eH71

下面为192.168.1.109中/etc/shadow文件中的结果:

test1:$6$51niux$cuJ5LteLgT/M5ZGO6G1.oj/UEpKV3Hm7bR4dOdjxa5zGJLyZxmgCkKHydu/tqb67EkAA7UoggEJwlsuqP8eH71:17355:0:99999:7:::

# ansible 192.168.1.109 -m user -a "name=test1 state=absent remove=yes"  #这是删除test1用户

1.9. group模块

# ansible 192.168.1.109 -m group -a 'name=haha gid=8000 state=present' #创建gid为8000的haha组

# ansible 192.168.1.109 -m group -a 'name=haha state=absent' #删除haha组

1.10.get_url模块

# ansible-doc -s get_url

dest= : 下载到哪里(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称。
force : 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件。
others : [file]模块接受的所有参数也可以在这里工作
sha256sum : 如果将SHA-256校验和传递给此参数,目标文件的摘要将在下载后计算,以确保其完整性
url= : HTTP,HTTPS或FTP URL(http | https | ftp)
url_password : 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用`url_password'参数。
url_username : 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'使用。
use_proxy : 如果是no,它将不使用代理,即使在目标主机上的环境变量中定义了一个代理。
validate_certs :如果“no”,SSL证书将不会被验证。 这只能使用自签名证书在个人控制的网站上使用。

# ansible 192.168.1.109 -m get_url -a 'url=http://nginx.org/download/nginx-1.8.1.tar.gz dest=/tmp/' -vvvv #url为要下载的链接,dest为要下载到的目录,-vvvv可以查看详细的执行过程

blob.png

1.11. synchronize模块

 # ansible-doc -s synchroniz(系统必须安装rsync 包,否则无法使用这个模块)

archive : 是否采用归档模式同步,即以源文件相同属性同步到目标地址
checksum : 基于校验和跳过,而不是mod-time和size; 请注意,默认情况下仍然启用“归档”选项 - “checksum”选项不会禁用它。
compress : 在传输过程中压缩文件数据。默认是yes开启。
copy_links : 是否复制符号链接,因为它们指向的对象(指示对象)被复制,而不是符号链接。
delete:删除源中没有而目标存在的文件(即以推送方为主)。此选项需要“recursive = yes”。
dest= :目标地址,将从源程序同步的目标机器上的路径; 路径可以是绝对的或相对的。
dest_port :目标主机上ssh的端口号。ansible配置文件中的 ansible_ssh_port 变量优先级高于该 dest_port 变量
dirs :  以非递归的方式传输目录
existing_only : 在接收器上跳过创建新文件。
group : 保存组
links : 将符号链接复制为符号链接。
mode : 指定同步方向。 在push模式下,localhost或delegate是源代码; 在拉模式下,上下文中的远程主机是源。
owner : 保存所有者(仅限超级用户)
perms : 保留权限。
recursive : 重新进入目录。
rsync_opts : 通过传递数组来指定其他rsync选项。
rsync_path : 服务的路径,指定 rsync 命令来在远程服务器上运行。这个参考rsync命令的--rsync-path参数,--rsync-path=PATH
rsync_timeout : 指定 rsync 操作的 IP 超时时间,和rsync命令的 --timeout 参数效果一样.
set_remote_user : 将user@用于远程路径。 如果您有自定义ssh配置来定义与库存用户不匹配的主机的远程用户,则应该设置此参数
src= : 源机器上将与目标同步的路径; 路径可以是绝对的或相对的。
times : 保留修改时间

# ansible 192.168.1.109 -m synchronize -a 'src=/tmp dest=/tmp/ compress=yes dest_port=22'  #synchronize为rsync同步模块,src为源目录,dest为目标目录,compress为yes是启动压缩,由于模块默认启用了archive参数,该参数默认开启了recursive, links, perms, times, owner,group和-D参数。如果你将该参数设置为no,那么你将停止很多参数,比如会导致如下目的递归失败,导致无法拉取。dest_port指定目的主机的ssh端口,ansible配置文件中的 ansible_ssh_port 变量优先级高于该 dest_port 变量。默认都是推送push。

# ansible 192.168.1.109 -m synchronize -a 'src=/tmp/ dest=/opt/ compress=yes  mode=pull delete=yes'  #将192.168.1.109上面的/tmp目录下拉到本地的/opt目录下面。

默认都是推送push。因此,如果你在使用拉取pull功能的时候,可以参考如下来实现mode=pull  更改推送模式为拉取模式。

1.12 setup模块

类似saltstack的grains静态信息收集,收集一些主机硬件信息或者以及其他如fqdn等等

#ansible all -m setup 就相当于ansible all -m setup -a “”#收集所有的信息

# ansible all -m setup -a "filter=ansible_nodename"  #filter=就是后面跟过滤的键名,这里就是查看所有的主机名

192.168.1.109 | success >> {
    "ansible_facts": {
        "ansible_nodename": "slave4.hadoop"
    }, 
    "changed": false
}

192.168.1.113 | success >> {
    "ansible_facts": {
        "ansible_nodename": "foreman.puppet"
    }, 
    "changed": false
}

192.168.1.108 | success >> {
    "ansible_facts": {
        "ansible_nodename": "master.hadoop"
    }, 
    "changed": false
}

192.168.1.112 | success >> {
    "ansible_facts": {
        "ansible_nodename": "zwidc_cache_192.168.1.112_youshi"
    }, 
    "changed": false
}

192.168.1.111 | success >> {
    "ansible_facts": {
        "ansible_nodename": "shidc_web_192.168.1.111_youshi"
    }, 
    "changed": false
}

# ansible all -m setup -a "filter=ansible_eth0"  #如获取所有eth0网卡的信息,这些键都在setup的输出结果里可以找到

# ansible all -m setup -a "filter=ansible_*_mb"  #当然也可以用正则表达式,这里就是将所有中间有两个_结尾是mb的过滤出来

作者:忙碌的柴少 分类:ansible系列 浏览:6092 评论:0
留言列表
发表评论
来宾的头像