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" #指定所有的节点去制定一条命令,命令用引号括起来。
#此图有成功后的效果图
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/
#此为一个节点成功的截图
[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参数就是当文件为目录时,进行递归设置权限
#有此图查看这两次设置的变化。
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=*
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=""里面的内容为定时任务的内容。下面看下执行后的截图:
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可以查看详细的执行过程
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的过滤出来