首页 > 系统相关 >Linux基础47 Ansible之ad-hoc, 命令模块(command, shell, script), 软件管理模块(yum, yum_repository), 文件管理模块(copy, fi

Linux基础47 Ansible之ad-hoc, 命令模块(command, shell, script), 软件管理模块(yum, yum_repository), 文件管理模块(copy, fi

时间:2024-02-02 18:24:56浏览次数:38  
标签:group 模块 nginx ansible yum file m01 root

Ansible之ad-hoc

一、什么是ad-hoc

1.什么是ad-hoc

ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存

2.ad-hoc使用场景

可以用作查看远程机器的进程,或者磁盘,或者拷贝文件

3.ad-hoc命令使用

[root@m01 ~]# ansible web01 -m shell -a 'free -m'
web01 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972         129         688          25         154         671
Swap:          1023           0        1023

4.ad-hoc结果返回含义

绿色: 代表被控端主机内容和控制端内容完全一致
黄色: 代表被控端主机发生了内容的改变
红色: 代表出现了故障,提示报错

5.ad-hoc常用的模块

command             # 执行shell命令(不支持管道等特殊字符)
shell               # 执行shell命令
scripts             # 执行shell脚本
yum_repository      # 配置yum仓库
yum                 # 安装软件
copy                # 变更配置文件
file                # 建立目录或文件
service             # 启动与停止服务
systemd             # 启动与停止服务
mount               # 挂载设备
cron                # 定时任务
get_url             # 下载软件
firewalld           # 防火墙
selinux             # selinux
setup               # 获取主机信息

5.ansible帮助

#1.查看所有模块(太多了,几乎不用)
[root@m01 ~]# ansible-doc -l
 
#2.查看指定模块的用法 (注意:按q退出。如果按ctrl+C退出,登录界面会异常,只能关闭重开)
[root@m01 ~]# ansible-doc yum
 
#3.查看模块参数
[root@m01 ~]# ansible-doc -s yum

 

二、Ansible命令模块

1.command模块(不识别特殊符号)(不加-m参数默认是command模块)

#默认模块,执行命令
[root@m01 ~]# ansible all -m command -a 'free -m'
web02 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972         207         585          25         179         581
Swap:          1023           0        1023
web01 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972         129         686          25         155         670
Swap:          1023           0        1023

#不识别特殊符号
[root@m01 ~]# ansible all -m command -a 'ps -ef | grep httpd'
web02 | FAILED | rc=1 >>
error: garbage option

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

2.shell模块

[root@m01 ~]# ansible all -m shell -a 'ps -ef | grep httpd'
web01 | CHANGED | rc=0 >>
root       8534   8529  0 00:06 pts/0    00:00:00 /bin/sh -c ps -ef | grep httpd
root       8536   8534  0 00:06 pts/0    00:00:00 grep httpd
web02 | CHANGED | rc=0 >>
root       8264   8259  0 00:06 pts/0    00:00:00 /bin/sh -c ps -ef | grep httpd
root       8266   8264  0 00:06 pts/0    00:00:00 grep httpd

#下面\用于转义,否则ansible无法识别。单引号如果多个,识别会有问题,用单引号双引号混合使用
[root@m01 ~]# ansible all -m shell -a "ifconfig eth0 | awk 'NR==2 {print \$2}'"
web02 | CHANGED | rc=0 >>
10.0.0.8
web01 | CHANGED | rc=0 >>
10.0.0.7

3.script模块

[root@m01 ~]# vim mkdir.sh
#!/bin/bash
mkdir /service

[root@m01 ~]# ansible web_group -m script -a '/root/mkdir.sh'
web02 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to web02 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to web02 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
web01 | FAILED! => {
    "changed": true, 
    "msg": "non-zero return code", 
    "rc": 1, 
    "stderr": "Shared connection to web01 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to web01 closed."
    ], 
    "stdout": "mkdir: cannot create directory ‘/service’: File exists\r\n", 
    "stdout_lines": [
        "mkdir: cannot create directory ‘/service’: File exists"
    ]
}
# 参看是否存在了
[root@m01 ~]# ansible web_group -m shell -a 'ls -ld /service'
web01 | CHANGED | rc=0 >>
drwxr-xr-x 4 root root 49 Nov 21 22:30 /service
web02 | CHANGED | rc=0 >>
drwxr-xr-x 2 root root 6 Jan 26 00:28 /service

 

三、Ansible软件管理模块

1.yum模块

[root@m01 ~]# ansible-doc yum
 yum:                    #这是playbook的写法
    name: httpd
    state: latest,absent,present

-----------------------------------
name:            #name可以写入的内容
    httpd        #服务名称
    http://        #安装软件的网络地址
    file        #安装本地的rpm包
state:    (默认为安装)
    latest        #安装最新版本的包(一般不用)
    present        #安装软件包
    absent        #卸载软件包
-----------------------------------

[root@m01 ~]# vim yum.yml    #写个playbook,后缀名都是yml
- host: web01    #主机
  tasks:        #动作
    - name: yum httpd    #动作注释
      yum:                #调用模块
        name: httpd
        state: present

#1.源安装
# 安装服务httpd(走的是远程机器的yum源)
[root@m01 ~]# ansible web_group -m yum -a 'name=httpd state=present'
相当于在远程机器上:yum install -y httpd

#2.指定网络上安装包
# 安装云上的服务
[root@m01 ~]# ansible web_group -m yum -a 'name=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present'
相当于在远程机器上: yum install -y https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm

#3.指定本地安装包安装
# 安装本地的rpm包(包一定先传到远程机器上)
[root@m01 ~]# ansible web_group -m yum -a 'name=/tmp/nginx-1.16.1-1.el7.ngx.x86_64.rpm'
相当于在远程机器上:yum localinstall -y /tmp/nginx-1.16.1-1.el7.ngx.x86_64.rpm

 

2.yum_repository模块

传repo源文件,用的较少,推荐用copy模块

[root@m01 ~]# ansible-doc yum_repository
yum_repository:
    name: epel
    description: EPEL YUM repo
    file: external_repos    #定义repo文件的名字(如果没有,就以name参数命名)
    baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
    gpgcheck: no
    mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge#定义源列表,可加可不加
    enabled: no
    state: absent    #添加为present(默认为添加),删除为absent
    

# 查看远程机器上是否有源
[root@web02 ~]# cd /etc/yum.repos.d/
[root@web02 yum.repos.d]# ls
CentOS-Base.repo  epel.repo  php.repo

#添加yum源 (加\转义,否则$basearch会被当成变量)
[root@web01 ~]# ansible web_group -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes"

------------------------------
name        #yum源里面[]的内容
description  #yum源里面的name
baseurl        #指定yum仓库
gpgcheck    #是否校验
    yes
    no
enabled        #是否启用仓库
    yes
    no
state
    present    #添加仓库
    absent    #删除仓库
file        #指定yum仓库名字
------------------------------

#参看被控制端上添加的yum源
[root@web02 yum.repos.d]# cat /etc/yum.repos.d/nginx.repo
[nginx]    #yum_repository模块中的name参数
baseurl = http://nginx.org/packages/centos/7/$basearch/
enabled = 1
gpgcheck = 0
name = nginx repo    #yum_repository模块中的description参数

#添加yum源    (file定义repo源名字)
[root@web01 ~]# ansible web_group -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes file=lhd"
[root@web02 yum.repos.d]# ls
CentOS-Base.repo  epel.repo  lhd.repo  nginx.repo  php.repo

#删除yum源
[root@web01 ~]# ansible web_group -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes file=lhd state=absent"


#添加多个内容的repo源(直接在执行一条name不同,file相同的即可)
[root@web01 ~]# ansible web_group -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes file=lhd state=present"
[root@web01 ~]# ansible web_group -m yum_repository -a "name=nginx-2 description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes file=lhd state=present"
# 注:file不修改的前提下,不修改name则是修改yum源,修改name就是添加一条yum源

 

四、文件管理模块

1.copy模块

[root@m01 ~]# ansible-doc copy
copy:
    src: /srv/myfiles/foo.conf    #源文件,管理机上文件或目录
    dest: /etc/foo.conf            #目标(如果是目录,就推送到该目录下,如果是文件,就会推送为该名称文件)
    owner: foo                    #权限属主(远端服务器必须真实存在)
    group: foo                    #权限属组(远端服务器必须真实存在)
    mode: '0644'                #文件权限(文件默认644,目录默认755) 小心,最好用默认的不配
    backup: yes/no                #是否备份
    content: '# This file was moved to /etc/other.conf'    #写一个文件(到远端文件)
    follow: yes/no        #识别远程文件是否是软链接
    force: yes/no        #先判断文件是否存在,存在就不推,不存在再推送

#推送文件至远端 (推送至目录,最好把/加上)
[root@m01 yum.repos.d]# ansible 'web_group' -m copy -a 'src=/root/mkdir.sh dest=/service/'

#如果推送目录则src不需要加/
[root@m01 yum.repos.d]# ansible 'web_group' -m copy -a 'src=/var/log/ dest=/tmp/'

[root@m01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
#推送仓库文件 (注意这里如果传的是*所有内容,命令是不认识的;可以推送文件夹,里面文件有变动就会覆盖)
[root@m01 yum.repos.d]# ansible web_group -m copy -a 'src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/'

#推送一个站点文件,并授权
[root@m01 yum.repos.d]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=644'

#推送一个站点文件,把远程服务器的原文件备份(推送的文件必须修改内容)      一般不用
[root@m01 yum.repos.d]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=644 backup=yes'
#远程服务器的原文件名字后面会加一个时间戳(处理起来比较麻烦)
#一般不用这种方式,开一个文件夹存原文件,如果有问题回退,把原文件再次分发

#将指定内容写入指定文件(相当于echo >命令)
[root@m01 ~]# ansible web_group -m copy -a "content='123456' dest=/etc/rsync_password"


如果推送的目标是软链接的情况下,用follow
#web01上做个软链接
[root@web01 html]# ln -s index.html.ori index.html
#这里follow为no不识别软链接,那么就直接拷过去,web01的index.html.ori软链接没了,变成一个文件
[root@m01 yum.repos.d]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html/index.html.ori owner=root group=root mode=644 follow=no'
#这里follow为yes识别软链接,内容会写到软链接链接的文件index.html中,index.html.ori软链接保留
[root@m01 yum.repos.d]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html/index.html.ori owner=root group=root mode=644 follow=no'

 

2.file模块

[root@m01 ~]# ansible-doc file
file:
    path: /etc/foo.conf        #要创建的文件或目录
    owner: foo
    group: foo
    mode: '0644'
    state: directory absent link
    recurse: yes

------------------------------
path:         #要创建的文件或目录
state:
    directory    #创建的是目录
    touch        #创建的是文件
    absent        #删除文件
    link        #创建软链接
        src        #连接的文件
        dest    #软链接
owner:    foo        #文件属主
group:    foo        #文件属组
mode:    '0644'    #文件权限
recurse:        #是否递归
    yes    (默认)
    no
    
#注意:
    1.当目录本身不存在时,递归创建就会递归授权
    2.当目录存在时,递归授权只授权你指定的目录下面的所有内容
------------------------------

#创建目录
[root@m01 ~]# ansible web_group -m file -a 'path=/code state=directory'
相当于远程机器上 mkdir /code
#无论/data/service存不存在,都会创建
[root@m01 ~]# ansible web_group -m file -a 'path=/data/service/new state=directory'

#创建目录并授权
[root@m01 ~]# ansible web01 -m file -a 'path=/file state=directory owner=root group=root mode=777'

#创建文件(上层文件必须存在)
[root@m01 ~]# ansible web_group -m file -a 'path=/data/service/new state=touch'

#创建文件并授权(如果已有该文件,会重新创建并覆盖)
[root@m01 ~]# ansible web_group -m file -a 'path=/data/service/new state=touch owner=adm group=adm mode=777'

#递归授权(默认recurse为yes) (code文件夹已存在,权限不变;wordress,htm,www都不存在,全部授权777)
[root@m01 ~]# ansible web_group -m file -a 'path=/code/wordress/htm/www state=directory owner=adm grou递归授权p=adm mode=777'
#递归授权 (/data/service/new都存在,只改new文件夹权限,new下级文件夹权限不变)
[root@m01 ~]# ansible web_group -m file -a 'path=/data/service/new state=directory owner=adm group=adm mode=777'

 

标签:group,模块,nginx,ansible,yum,file,m01,root
From: https://www.cnblogs.com/ludingchao/p/18003638

相关文章

  • vs2022支持c++20 import模块功能
    参考链接:https://blog.csdn.net/fellow1984/article/details/124819231工具->获取工具和功能->VisualStudioInstaller->单个组件:搜索C++模块,勾选项目属性对应项修改编译代码即可//helloworldimport<iostream>;intmain(){ std::cout<<"helloworld\n";......
  • 如何执行dockerfile文件
    前提 maven打包tar包mvncleaninstall-DskipTests 要执行Dockerfile,可以按照以下步骤进行操作:首先确保已经安装了Docker。在命令行中输入docker--version来查看版本信息,若显示正常则表明已成功安装。创建一个新的文件夹用于存放Dockerfile及相关资源文件。打开......
  • Qt 解决中报错xxx.h:4:10: ‘QMainWindow‘ file not found
    前言qt中这个报错非常无语,在一个目录下打开是正常的,然后copy项目到其他文件夹就找不到报错,大家的原因都不太相同,这里列出以下几种可能及解决方法。可能1.中文路径很有可能copy到了一个中文路径下的目录,然后导致出现问题。解决方式就是换到英文目录可能2.将.pr......
  • file_get_contents 避免出现按个 ssl -60 的报错 ,不进行数据验证 或者 使用php.ini 进
    1,使用不去验证数据$stream_opts=["ssl"=>["verify_peer"=>false,"verify_peer_name"=>false,]];$user_info=json_decode(file_get_contents($user_info_url,false,stream_context_create($stream_opts)));2,配置php.ini......
  • 什么是电源模块效率 如何计算 提高效率的方法 BOSHIDA博士达
    什么是电源模块效率如何计算提高效率的方法BOSHIDA博士达电源模块效率是指输入电能转换为输出电能的比例,通常以百分比表示。高效率的电源模块能够最大限度地将输入电能转化为有用的输出电能,减少能量的损耗和浪费。以下是与电源模块效率相关的一些知识点:效率公式:电源模块的效率......
  • 全志R128 SDK HAL 模块开发指南之HW Spinlock
    模块介绍hwspinlock提供一种硬件同步机制,lock操作可以防止多处理器同时处理共享数据。保证数据的一致性。源码结构├──hal_hwspinlock.c├──hwspinlock.h├──Kconfig├──Makefile├──platform│├──hwspinlock-sun20iw2.h└──platform-hwspinlock......
  • sqlserver SQLServer Profiler 模板制作和导入
    SQLServerProfiler是一个基于图形界面的工具,用于监视和分析SQLServer数据库系统的活动。目录一、使用标准模板追踪数据库服务器SQL二、制作模板三、导出模板四、将模板文件导入新的客户端五、在新的客户端修改配置和使用模板 使用标准模板追踪数据库服务器SQL ......
  • nerdctl build -- command to build container image from docker file
    1.Prerequisiteofusingnerdctlbuildbuildctlneedstobeinstalledandbuildkitdneedstoberunning.2.checkifbuildctlinstalled$nerdctlversionClient:Version: v1.7.2OS/Arch: linux/amd64Gitcommit: e32c4b023bf41e5c8325cfb893a53cefb5fc68edb......
  • mysql: error while loading shared libraries: libncurses.so.6: cannot open shared
    查找没有libncurses.so.5,可能有libncurses.so不同版本的文件,使用命令find/-name'libncurses*'复制+覆盖软链接先复制到lib64文件夹,再用软链接重新覆盖一下[root@lab-aliyunwzx]#cp/home/wll/miniconda3/lib/libncurses.so.6/lib64[root@lab-aliyunwzx]#cd/lib6......
  • stream里面filter foreach 还能再fileter吗
    是的,在 Java 的 Stream API 中,你可以在 filter 和 forEach 操作之间再次使用 filter。实际上,你可以根据需要链式调用多个中间操作(如 filter、map 等),但请注意,forEach 是一个终端操作,它会消费流并产生一个非流的结果。一旦调用了 forEach 或其他任何终端操作,流就被消......