ansible常用模块总结

发布于 2019-10-18  1.31k 次阅读


查看模块的帮助说明:
ansible-doc 模块名【详细说明】
ansible-doc -s 模块名【简短说明】
shell模块
比command模块详细,使用的是shell执行命令
ansible all -m shell -a 'echo $HOSTNAME'  【注意得用单引号】
调用bash执行命令,类似cat /tmp/stan.md | awk -F '|' '{print $1}' &>/tmp/test.txt 这种负载的命令,使用shell模块也可能失败;
解决办法:写入脚本里,copy到远程执行,再把需要的结果拉回执行命令的机器

举例:shell模块
tasks:
  - name: test
    shell: mv *.txt /tmp     【使用通配符移动txt后缀的文件到/tmp目录】
    args:
    chdir: /hudechao         【参数chdir表示执行shell命令之前先切换到此目录下】
    executable: /bin/bash    【参数executable表示使用/bin/bash解释器就可以在shell模块中使用通配符的元字符】

tasks:
  - name: test
    shell: echo '123' >> ../test_file/file.txt
    args:
      executable: /bin/bash
      chdir: /hudechao/ansible/test_file 【注:shell模块操作文件等,chdir的路径必须是文件所在的绝对路径否则shell模块有可能执行失败】
      
tasks:
  - name: test
    shell: echo '456' >> /tmp/file.txt   【如果是创建文件/tmp/file.txt,可以不用指定路径,不过,最好是指定chdir路径】
    args:
      chdir: /tmp
        
常用参数:
chdir:    在执行shell命令之前,首先进入到chdir参数指定的目录中
creates:  此参数指定一个文件,当指定的文件存在时,就不执行对应shell命令
removes:  此参数指定一个文件,当指定的文件不存在时,就不执行对应shell命令
executale:默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,如果要使用其它类型的shell执行,指定shell文件即可。
script模块
运行脚本
ansible all -m script -a '/home/software/host.sh'
copy模块
把本地的src文件复制到远程目标主机上
ansible all -m copy -a 'src=/home/software/list.sh dest=/home/software backup=yes'
【一般要自定源:src、指定目标位置:dest、如果有就备份backup=yes、等等】
ansible all -m copy -a 'src=/home/software/list.sh dest=/home/software backup=yes mode=755 owner=hudechao'
【赋值过去并修改权限和属主】
ansible all -m copy -a 'content=hahaha dest=/home/software/file.txt'
【利用conten的内容直接生成文件file.txt】

- name: copy test
  copy:
    sec: /home/software/list.sh
    dest: /home/software
    backup: yes
copy模块参数:
src:                      将本地路径复制到远程服务器; 可以是绝对路径或相对的。如果是一个目录,它将被递归地复制。如果路径以/结尾,则只有该目录下内容被复制到目的地,
                          如果没有使用/来结尾,则包含目录在内的整个内容全部复制。

dest:                     目标绝对路径。如果src是一个目录,dest也必须是一个目录。如果dest是不存在的路径,并且如果dest以/结尾或者src是目录,则dest被创建。如果src和dest
                          是一个文件,如果dest的父目录不存在,任务将失败
                          
backup: yes/no(默认值no)  在覆盖之前将原文件备份,备份文件包含时间信息
content: hahaha           当用content代替src参数的时候,可以把文档的内容设置到特定的值
owner:                    设置目标文件或目录的所属用户  
group:                    设置目标文件或目录的所属组
mode:                     设置目标文件或目录的权限:一般以0开头,如0755
remote_src:              如果设置为yes(默认值为No),它会从目标主机上先搜索src文件
validate:                 yes/no(默认值no),复制前是否检验需要复制目的地的路径
fetch模块
从客户端取文件至本机上,目录可先tar
ansible all -m fetch -a 'src=/home/software/list.sh dest=/home/software'

fetch:
    src: /home/33.txt    //客户端的IP地址假设为:10.132.42.36;src的绝对路径必须是文件不能是目录
    dest: /tmp/hudechao
    #flat: yes           //flat表示直接地
    
1、如果不加flat: yes
则复制到dest目录下保存方式为:/tmp/hudechao/10.132.42.36/home/33.txt
2、如果加上flat:yes
则dest:/tmp/hudechao/  目标路径末尾必须带上 / ,且如果dest目录下有33.txt同名文件,则会覆盖掉
打压缩包和解压缩包模块
archive 压缩
unarchive 解压缩
- unarchive: src=foo.tgz dest=/var/lib/foo 【解压缩foo.tgz包,解压到/var/lib/foo目录下】
属性:remote_src=no/yes【默认值no,表示要从本地复制压缩包到目标主机解压;yes表示压缩包在目标主机上已存在且如果src是URL,则从网上下载并解压】

- name: test
  unarchive:
    src: /home/package/file.tar
    dest: /hudechao/ansible/unarchive
    owner: hudehcao
    group: hudechao
    mode: 0755
[unarchive模块自己的赋权限选项:owner和group,最后修改的只是针对在/hudechao/ansible/unarchive/file.txt解压后的目标文件file.txt]
[如果目录下有其它文件,则不会更改其权限,如/hudechao/ansible/unarchive/test.txt,test.txt的权限不会被更改]
file 模块
设置文件属性
ansible all -m file -a 'path=/home/software/file.txt owner=root mode=0755'
ansible all -m file -a 'src=/home/software/testfile dest=/home/software/testfile_link state=link' 
解释:
根据state的值创建软连接;state的不同值代表不用的含义;ansible-doc file查看帮助命令state
ansible all -m file -a 'name=/home/123 state=touch' 【在远程机器上创建文件/home/123】
recurse=yes/True 表示递归设置属性,当创建目录时,如递归的设置目录的属组都是一个。
设置权限mode=0755,首位带上0否则可能出现赋权限差异问题。

- name: test
  file:
    path: /hudechao/test  [这里功能是:对/test这个目录进行赋权限]
    owner: hudechao
    group: hudechao
    recurse: yes          [recurse值设置为yes表示:如果test目录下还有文件或目录,就递归设置其权限]
cron模块
计划任务,支持时间:minute、hour、day、month、weekday
ansible all -m cron -a 'minute=*/5  job="ls /root" name=Check'  【创建时钟同步任务】
ansible all -m cron -a 'state=absent name=Check' 【删除计划任务,这里name是对定时任务的别名】
ansible all -m cron -a 'disabled=true job="ls /root" name=Check' 【禁用定时任务或者yes,job和name都必须有】
ansible all -m cron -a 'disabled=false job="ls /root" name=Check' 【启用定时任务或者no,job和name都必须有】
yum模块
yum包下载安装
ansible all -m yum -a 'name=httpd state=latest' 【安装】
ansible all -m yum -a 'name=httpd,vsftpd,apache state=latest' 【安装多个逗号隔开】
ansible all -m yum -a 'name=flatpak-libs-0.8.8-4.el7_5.x86_64.rpm state=latest' 【指定安装单个rpm包】
ansible all -m yum -a 'name=httpd state=absent' 【删除卸载】
service模块
管理服务
ansible all -m service -a 'name=httpd state=started'
ansible all -m service -a 'name=httpd state=restarted'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
user模块
管理用户
ansible all -m user -a 'name=hudechao comment="test user" uid=1048 home=/home/hudechao group=root'
ansible all -m user -a 'name=hudechao system=yes home=/home/hudechao group=root'
ansible all -m user -a 'name=hudechao state=absent remove=yes' 【删除用户及家目录;remove=yes表示删除家目录】

shell命令查看用户是否被创建:getnet passwd 用户名
ansible all -m user -a 'name=hudechao group=root' password={{ user_passwd | password_hash('sha512') }} generate_ssh_keys=yes  update_password=yes
【password={{ user_passwd | password_hash('sha512') }}  表示创建用户设置密码并对密码使用sha512加密算法加密】
【generate_ssh_keys=yes 表示创建用户时,也生成秘钥文件id_rsa.pub,id_rsa】

- name: create user
  user:
    name: hudechao
    uid: 1048
    home: /home/hudechao  【设置用户hudechao的家目录】
    group: hudechao       【group表示为用户hudechao设置唯一的属组】
    groups: hudechao,Lily 【groups表示为用户hudechao添加多个属组】
    state: absent         【表示删除用户hudechao】
lineinfile 模块
修改文件内容
tasks: 
  - name: test
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: '^MaxStartup.*'
      line: 'MaxStartup 1000:30:1000'
解释:
regexp: '^MaxStartup.*'   匹配MaxStartup的'M'开头的行;用line的值去替换,当没有正则匹配到就插入line的值
regexp: '^(MaxStartup)'   匹配以MaxStartup开头的行;
regexp: 'MaxStartup$'     匹配以MaxStartup的'p'结尾的行;
regexp: '(MaxStartup)$'   匹配以MaxStartup结尾的行;

又如:
- name: test
  lineinfile:
    path: /home/file.txt
    regexp: '^Max'
    insertafter: '^Jerry'
    insertbefore: '^Jerry'
    line: '123'
模块参数解释:
insertafter: '^Jerry' ,也是正则表达式,表示如果regexp的正则表达式没有匹配到时,就匹配 '^Jerry',并且匹配到后即将line的值插入在'^Jerry'的后面(另起一行)
insertbefore: '^Jerry' ,也是正则表达式,表示如果regexp的正则表达式没有匹配到时,就匹配 '^Jerry',并且匹配到后即将line的值插入在'^Jerry'的前面(另起一行)

lineinfile模块还可实现文件内容的注释:
  - name: test
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: '^MaxStartup.*'
      line: '#MaxStartup 1000:30:1000'
解释:
regexp: '^MaxStartup.*' 匹配MaxStartup开头的行;用line的值去替换,替换的开头加入了#号即表注释
timezone模块
设置市区
timezone: name="Asia/Shanghai"
setup模块
setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

1)、举例:获取ansible-demo3 主机的信息:
[root@ansible-manager ~]# ansible ansible-demo3 -m setup
ansible-demo3 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.128.83"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::250:56ff:fe35:785f"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/02/2015", 
      ......
        "ansible_userspace_architecture": "x86_64", 
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "gather_subset": [
            "all"
        ], 
        "module_setup": true
    }, 
    "changed": false
}
返回的信息非常多,很多情况我们并不需要全部的信息,可以通过过滤获得指定的信息。

2)、设置filter参数指定需要获取的参数:获取 ansible-demo3 主机的 IPV4 地址
[root@ansible-manager ~]# ansible ansible-demo3 -m setup -a "filter=ansible_all_ipv4_addresses"
ansible-demo3 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.128.83"
        ]
    }, 
    "changed": false
}

3)、通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息
[root@ansible-manager ~]# ansible ansible-demo3 -m setup -a "filter=*mb"
ansible-demo3 | SUCCESS => {
    "ansible_facts": {
        "ansible_memfree_mb": 1542, 
        "ansible_memory_mb": {
            "nocache": {
                "free": 1654, 
                "used": 168
            }, 
            "real": {
                "free": 1542, 
                "total": 1822, 
                "used": 280
            }, 
            "swap": {
                "cached": 0, 
                "free": 2047, 
                "total": 2047, 
                "used": 0
            }
        }, 
        "ansible_memtotal_mb": 1822, 
        "ansible_swapfree_mb": 2047, 
        "ansible_swaptotal_mb": 2047
    }, 
    "changed": false
}

4)、其他常用信息列出如下:
ansible_all_ipv4_addresses:        仅显示ipv4的信息
ansible_devices:                   仅显示磁盘设备信息
ansible_distribution:              显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:      仅显示系统版本
ansible_machine:                   显示系统类型,例:32位,还是64位
ansible_eth0:                      仅显示eth0的信息
ansible_hostname:                  仅显示主机名
ansible_kernel:                    仅显示内核版本
ansible_lvm:                       显示lvm相关信息
ansible_memtotal_mb:               显示系统总内存
ansible_memfree_mb:                显示可用系统内存
ansible_memory_mb:                 详细显示内存情况
ansible_swaptotal_mb:              显示总的swap内存
ansible_swapfree_mb:               显示swap内存的可用内存
ansible_mounts:                    显示系统磁盘挂载情况
ansible_processor:                 显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:           显示cpu个数(只显示总的个数)
cron模块
cron 模块可以帮助我们管理远程主机中的计划任务,功能相当于 crontab 命令
1)、常用参数
minute参数: 此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即 minute=5,当不使用此参数时,分钟设定位的值默认为”*”
hour参数:   此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即 hour=1,当不使用此参数时,小时设定位的值默认为”*”
day参数:    此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”*”
month参数:  此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”*”
weekday参数:此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”*”
【上述同shell的crontab一样:分、时、日、月、周】

special_time参数:在上述示例3与示例4中,计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有(即special_time=如下各值) reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)

user参数:    此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job参数:     此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令
name参数:    此参数用于设置计划任务的名称(名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务)
state参数:   当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent

disabled参数:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做

backup参数:  如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes

2)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”crontab test”,任务于每天1点5分执行,任务内容为输出test字符
ansible ansible-demo3 -m cron -a " name='crontab test' minute=5 hour=1 job='echo test' "

3)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出 test 字符
ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "

4)、举例:
在 ansible-demo3 主机上创建计划任务,任务名称为”special time test”,任务将在重启时执行,任务内容为输出 test 字符
ansible ansible-demo3 -m cron -a " name='special time test' special_time=reboot job='echo test' "

5)、举例:
由于”special time test”已经存在,所以,当我们再次操作同名的任务时,ansible 将会认为是修改原来的任务。执行如下命令,原计划任务会被修改,因为启用了 backup,所以任务在修改前会被备份
ansible ansible-demo3 -m cron -a " name='special time test' special_time=hourly job='echo test' backup=yes "

6)、举例:
任务”special time test”已经存在于 ansible-demo3 主机中,如果我们想要删除这个计划任务,可以执行如下命令,删除任务的同时可以进行备份
ansible ansible-demo3 -m cron -a " name='special time test' state=absent backup=yes "

7)、举例:
默认操作的是 root 用户的计划任务,如果想要操作远程主机中其他用户的计划任务,可以指定要操作的用户
ansible ansible-demo3 -m cron -a "user=ding name='special time test' special_time=hourly job='echo test' "

8)、举例:
注释“crontab test” 的计划任务
ansible ansible-demo3 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' disabled=yes backup=yes"

参考:https://www.jianshu.com/p/8eb777bf6926


公交车司机终于在众人的指责中将座位让给了老太太