2.自动化运维工具之Ansible ad-hoc

2022-03-07 分类:ansible 阅读(256) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.ad-hoc基本介绍

1.什么是ad-hoc?

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

2.ad-hoc模式的使用场景

比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等

3.ad-hoc模式的命令使用

#批量查看磁盘信息
[root@mb01 ~]# ansible web -m command -a 'df -h' -i /etc/ansible/hosts
#批量查看root目录信息
[root@mb01 ~]# ansible web -m command -a 'ls -l /root' -i /etc/ansible/hosts

4.ad-hoc结果返回颜色

绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

2.ad-hoc常用模块

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

1.Ansible-doc帮助手册

[root@mb01 ~]# ansible-doc -l   #### 查看所有模块说明
[root@mb01 ~]# ansible-doc copy  #### 查看指定模块方法,搜索EXAMPLES可以查看示例
[root@mb01 ~]# ansible-doc -s  copy#### 查看指定模块参数

2.执行命令模块(command,shell,script)

2.1.command命令模块,不支持重定向或管道
command模块 直接写上命令即可
# 默认模块, 执行命令
[root@mb01 ~]# ansible webs -a 'hostname'
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.8 | CHANGED | rc=0 >>
web02
2.2.shell模块,如果需要一些管道操作,则使用shell
使用起来与command一致, shell模块支持管道 特殊符号
[root@mb01 ~]# ansible webs -m shell -a "hostname -I|cut -d ' ' -f1"
172.16.1.7 | CHANGED | rc=0 >>
10.0.0.7
172.16.1.8 | CHANGED | rc=0 >>
10.0.0.8
2.3.script脚本模块
# 编写脚本
[root@mb01 ~]# mkdir -p /server/scripts
[root@mb01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iftop
#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@mb01 ~]# ansible web -m script -a '/server/scripts/yum.sh'

3.软件管理模块

3.1yum模块

[root@mb01 ~]# ansible webs -m yum -a "name=httpd state=present"
	Name
		httpd #指定要安装的软件包名称
		file:// #指定本地安装路径(yum localinstall 本地rpm包)
		http:// #指定yum源(从远程仓库获取rpm包)
	state              #指定使用yum的方法
		installed,present #安装软件包
		removed,absent #移除软件包
		latest #安装最新软件包
	exclude=kernel*,foo* #排除某些包
	list=ansible #类似于yum list查看是否可以安装
	disablerepo="epel,ol7_latest" #禁用指定的yum仓库
	download_only=true #只下载不安装 yum install d
3.2yum_repository

name #指定仓库名,如果没有file则为仓库文件名
baseurl #指定yum源
gpgcheck #指定检查秘钥
no yes
enabled #是否启用仓库
no yes

4.Ansible文件管理模块(copy,file,get_ur)

4.1.copy文件拷贝模块
# 推送文件模块
[root@mb01 ~]# ansible webs -m copy -a 'src=/etc/hosts dest=/tmp/1234.txt'
# 在推送覆盖远程端文件前,对远端已有文件进行备份,按照时间信息备份
[root@mb01 ~]# ansible webs -m copy -a 'src=/etc/hosts dest=/tmp/1234.txt backup=yes'
# 直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息
[root@mb01 ~]# ansible webs -m copy -a 'content=1234 dest=/tmp/1234.txt backup=yes'
src #推送数据的源文件信息
dest #推送数据的目标路径
backup #对推送传输过去的文件,进行备份
content #直接批量在被管理端文件中添加内容
group #将本地文件推送到远端,指定文件属组信息
owner #将本地文件推送到远端,指定文件属主信息
mode #将本地文件推送到远端,指定文件权限信息
#####注意,在复制文件时,如果对端没有目录会自动创建目录,但是如果自动创建目录了就没法对文件改名
4.2.file文件创建模块
创建目录
[root@mb01 ~]# ansible webs -m file -a 'path=/code/src/back state=directory'
创建软连接
[root@mb01 ~]# ansible webs -m file -a 'src=/code/src/back path=/code/back state=link'
path #指定远程主机目录或文件信息
recurse #递归授权
state
	directory #在远端创建目录
touch #在远端创建文件
link #link或hard表示创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息
4.3.get_ur文件下载模块
ansible中的wget命令
#1.通过get_url下载文件或者软件
[root@mb01 ~]# ansible webs -m get_url -a 'url=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.0-1.el7.x86_64.rpm dest=/tmp'
url #指定下载地址
dest #指定下载的目录
mode #指定权限
checksum #校验加密算法

5.服务管理模块(systemd)

ansible管理服务的启动与停止,使用service或systemd
[root@mb01 ~]# ansible webs -m service -a 'name=crond state=started enabled=yes'
[root@mb01 ~]# ansible webs -m systemd -a 'name=crond state=started enabled=yes'
name  # 定义要启动服务的名称
state # 指定服务状态
	started #启动服务
	stopped #停止服务
	restarted #重启服务
	reloaded #重载服务
enabled #开机是否自启

6.用户管理模块

6.1.group组模块
[root@mb01 ~]# ansible webs -m group -a 'name=ro gid=777'
name  #指定创建的组名
gid  #指定组的gid
state
	absent  #移除远端主机的组
	present   #创建远端主机的组(默认)
6.2user模块
#创建用户并不创建家目录
[root@mb01 ~]# ansible webs -m user -a 'name=ro uid=777 group=777 create_home=no '
uid #指定用户的uid
group #指定用户组名称
groups #指定附加组名称
password #给用户添加密码(单引号)
shell #指定用户登录shell
create_home #是否创建家目录
#给普通用户创建秘钥
[root@mb01 ~]# ansible webs -m user -a 'name=roo generate_ssh_key=yes ssh_key_bits=1024 ssh_key_file=/home/roo/.ssh/id.rsa '
generate_ssh_key=yes#创建秘钥
ssh_key_bits=2048#秘钥字节
ssh_key_file=.ssh/id_rsa  #私钥路径
#修改用户密码
对明文密码进行加密
[root@mb01 ~]# ansible localhost -m debug -a "msg={{ '123456' | password_hash('sha512', 'salt') }}"
修改密码
[root@mb01 ~]#ansible webs -m user -a 'name=roo password=
$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w.igcOo1R7vBYR65JquIQ/7siC7VRpmteKvZmfSkNc69.'

7.Ansible定时任务模块

#创建定时任务
[root@mb01 ~]# ansible webs -m cron -a 'name="定时执行脚本" minute=0 hour=0 day=*/2 month=* weekday=* job="sh /server/...sh &>/dev/null"'
注释定时任务
[root@mb01 ~]# ansible webs -m cron  -a 'name="定时执行脚本" job="sh /server/...sh &>/dev/null" disabled=yes '
删除定时任务
[root@mb01 ~]# ansible webs -m cron  -a 'name="定时执行脚本" state=absent '
name #指定名字
minute#分
hour#时
day#日
month#月
weekday#周
state#状态
	present
	absent
disabled 是否注释

8.磁盘挂载模块

#安装nfs服务
[root@mb01 ~]# ansible 172.16.1.51 -m yum -a 'name=nfs-utils state=installed'
#编辑配置nfs配置文件
[root@mb01 ~]# ansible 172.16.1.51 -m copy -a 'content="/data (rw,no_all_squash)" dest=/etc/exports backup=yes'
#查看配置文件内容
[root@mb01 ~]# ansible 172.16.1.51  -a ' cat /etc/exports'
172.16.1.51 | CHANGED | rc=0 >>
/data (rw,no_all_squash)
#创建共享目录,并授权
[root@mb01 ~]# ansible 172.16.1.51  -m file -a 'name=/data owner=nfsnobody group=nfsnobody state=directory'
#启动nfs服务及rpcbind服务
[root@mb01 ~]# ansible 172.16.1.51 -m service  -a 'name=nfs state=started enabled=yes'
[root@mb01 ~]# ansible 172.16.1.51 -m service -a 'name=rpcbind state=restarted enabled=yes'
#检查共享文件创建情况
[root@mb01 ~]# ansible 172.16.1.51 -a 'showmount -e'
172.16.1.51 | CHANGED | rc=0 >>
Export list for mysql:
/data 172.16.1.0/24
#挂载共享目录
[root@mb01 ~]# ansible 172.16.1.51 -m mount -a 'src=172.16.1.51:/data path=/mnt state=mounted fstype=nfs'
######
present # 开机挂载,仅将挂载配置写入/etc/fstab
mounted
 # 挂载设备,并将配置写入/etc/fstab
unmounted #卸载设备,不会清除/etc/fstab写入的配置
absent # 卸载设备,会清理/etc/fstab写入的配置
remounted   #重新挂载

9.Ansible防火墙模块(Selinux,iptables,firewalld)

9.1.Selinux防火墙
[root@mb01 ~]# ansible webs -m selinux -a 'state=disabled'
9.2. iptables模块
#添加共享上网
[root@mb01 ~]# ansible 172.16.1.51 -m iptables -a 'table=nat chain=POSTROUTING protocol=tcp action=append source=172.16.1.0/24 jump=SNAT to_source=10.0.0.51'
action #默认是append追加-A insert插入-I
chain #指定链
source #-s 指定源ip
destination #-d 指定目标ip
protocal  #-p 指定协议
source_port   #--sport指定源端口
destination_port #--dport指定目标端口
jump  #-j DROP/ACCEPT
state  #present(默认,添加规则)   absent(删除)
9.3.firewalld防火墙
[root@m01 ~]# ansible webservers -m systemd -a "name=firewalld state=started" -i ./hosts
[root@m01 ~]# ansible webservers -m firewalld -a "service=http immediate=yes permanent=yes state=enabled" - i ./hosts
service #指定开放或关闭的服务名称
port #指定开放或关闭的端口
masquerade #开启地址伪装
immediate #临时生效
permanent #是否添加永久生效
state #开启或是关闭
zone #指定配置某个区域
rich_rule #配置富规则
source #指定来源IP

10.mysql_user模块

    - name: 创建用户
      mysql_user:
        login_host: localhost
        login_user: root
        host: 172.16.1.0/24
        name: boke
        password: 123456
        priv: "*.*:ALL,GRANT"
        state: present
login_host=“localhost” 指定本地root用户登录本机mysql
login_password=“123.com” root用户的登录密码
login_user=“root” 为root用户或者mysql用户
login_port=“3306” 数据库端口号
name="" 指定grant授权用户
password="" grant授权用户密码
priv="" 库名.SQL语句权限,GRANT
host="" 授权远程登录的IP地址,一般为 网段.% 或者直接 %
state=“present” 创建授权用户
state=“absent” 删除授权用户

11.ansible mysql_db模块

mysql_db模块用于建立、删除、导入和导出数据库
建立数据库
state="present"
---
- name: mysql
  hosts: db
  tasks:
  - name: create a database
    mysql_db:
      login_host: "127.0.0.1"
      login_user: "root"
      login_password: "mysql@123"
      login_port: "3306"
      name: "mezz"
      encoding: "utf8"
      state: "present"
删除数据库
---
- name: mysql
  hosts: s.hi.com
  tasks:
  - name: delete a database
    mysql_db:
      login_host: "127.0.0.1"
      login_user: "root"
      login_password: "mysql@123"
      login_port: "3306"
      name: "mezz"
      state: "absent"
导出数据库
---
- name: mysql
  hosts: s.hi.com
  tasks:
  - name: dump a database
    mysql_db:
      login_host: "127.0.0.1"
      login_user: "root"
      login_password: "mysql@123"
      login_port: "3306"
      name: "mezz"
      target: "/tmp/mezz.gz"
      state: "dump"
导入数据库
---
- name: mysql
  hosts: s.hi.com
  tasks:
  - name: import a database
    mysql_db:
      login_host: "127.0.0.1"
      login_user: "root"
      login_password: "mysql@123"
      login_port: "3306"
      name: "mezz"
      target: "/tmp/mezz.gz"
      state: "import

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1