Ansible - [03] Ansible ad-hoc模式
Ansible ad-hoc是一种通过命令行批量管理的方式
格式:ansible 主机集合 -m 模块名 -a "参数"
其他参数: -k 使用密码远程、-i 指定主机列表文件

以上是调用ping模块,模块就是脚本(多数为Python脚本),多数脚本都支持参数,默认模块是command
command 模块(默认)

也可以不带 -m command
执行以下命令可以列出ansible的所有模块
# 查看ansible有哪些模块
ansible-doc -l
# 过滤指定模块
ansible-doc -l | grep yum
# 查看模块的帮助信息
ansible-doc yum
# ansible 模块总数
[root@node01 ansible]# ansible-doc -l | wc -l
3387

shell 模块
command和shell模块的区别
- command模块的命令不启动shell,直接通过ssh执行命令
- command不支持bash的特性,如管道和重定向等功能
- 所有需要调用shell的功能都无法实现

file 模块
可以创建文件、目录、链接;修改权限与属性等
具有幂等性,任意次执行所产生的影响均与一次执行的影响相同
# 新建文件
ansible test -m file -a "path=/tmp/file.txt state=touch"
# 创建目录
ansible test -m file -a "path=/tmp/mydir state=directory"
# 修改文件或目录权限
ansible test -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777"
# 删除目录
ansible test -m file -a "path=/tmp/mydir state=absent"
# 删除文件
ansible test -m file -a "path=/tmp/file.txt state=absent"
# 给/etc/hosts文件创建一个链接文件
ansible test -m file -a "src=/etc/hosts path=/tmp/host.txt state=link"


copy 模块
将文件拷贝到远程主机
backup=yes (提示:这个不是参数设置)如果目标主机有同名文件,则先备份
# 新建一个测试文件用于测试ansible的copy模块
echo AAA>~/a3.txt
# 将控制节点的a3.txt下发到被控制节点的/root目录下
ansible test -m copy -a "src=~/a3.txt dest=/root/"
# 下发文件并重命名为3a.txt
ansible test -m copy -a "stc=~/a3.txt dest=/root/3a.txt"
# 通过content可以直接提供文件内容, \n代表回车
ansible test -m copy -a "content='hello the world\n' dest=/root/new.txt"
Tips:
1、在控制节点上的a3.txt内容发生变化,在ansible调用copy模块向主机组test下的主机下发文件时,会判断目标目录下的文件内容和本次下发的文件进行对比,包括md5,如果不一致,则会进行覆盖。
2、再次执行命令,判断md5(checksum)和文件内容均未发生变化,会提示操作SUCCESS,并且changed为false。
fetch 模块
与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地,同名文件会按照主机名创建对应的目录,并将同名文件放到对应的主机名命名的目录下
# 将远程主机的hostname文件下载到本地家目录
ansible test -m fetch -a "src=/etc/hostsname dest=~/"

- 可以用于获取多台服务器的日志文件
lineinfile 模块 | replace 模块
修改单个文件的单行内容时可以使用lineinfile模块
# 在/etc/issue文件中添加一行内容hello world,默认添加到最后
ansible test -m lineinfile -a "path=/etc/issue line='hello world'"
# 基于幂等原则,重复执行,不会创建多行内容
ansible test -m lineinfile -a "path=/etc/issue line='hello world'"
# 将内容插入到Kernel行的后面
ansible test -m lineinfile -a "path=/etc/issue line='insert' insertafter='Kernel'"
# 修改单个文件的单行内容,在文件中正则匹配包含hello的行,把整行内容替换为ni hao
# 如果无法匹配到hello,则在文件最后添加一行nihao
# 如果有多行内容包含hello,则仅替换最后一行
ansible test -m lineinfile -a "path=/etc/issue regexp='hello' line='ni hao'"
lineinfile会替换一整行,replace可以替换关键词
# 将/etc/issue文件全文所有的Kernel替换为Ocean
ansible test -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
# 将agent主机组的节点上 /etc/selinux/config 拷贝到 /root 下,替换SELINUX=disabled为SELINUX=enforcing
ansible agent -m replace -a "path=/root/config regexp='SELINUX=disabled' replace='SELINUX=enforcing'"

user 模块
可以实现Linux系统账户管理
- 一万台服务器创建一两个普通用户,并且配置密码的场景?
# 远程test组中的所有主机创建用户harley
ansible test -m user -a "name=harley"
# 创建用户,并配置所属组、家目录等账户属性
ansible test -m user -a "name=harley uid=1010 group=adm groups=daemon,root home=/home/harley"
# 修改账户密码,需要经过hash值的加密,才能让计算机识别
ansible test -m user -a "name=harley password={{'123456'|password_hash('sha512')}}"
# 修改账户的附加组
ansible test -m user -a "name=harley groups=root,daemon"
# 删除账户
ansible test -m user -a "name=harley state=absent"
# 删除账户同时删除家目录、邮箱
ansible test -m user -a "name=harley state=absent remove=true"
查看加密的密码:
grep -i harley /etc/shadow
yum_repository 模块
使用 yum_repository 可以创建或修改yum源配置文件
# 新建一个yum源配置文件/etc/yum.repos.d/myyum.repo
# yum源文件名为myyum,该文件的内容如下:
ansible test -m yum_repository -a "name=myyum description=hello baseurl=ftp://192.168.4.254/centos gpgcheck=no"
[myyum]
baseurl=ftp://192.168.4.254/centos
gpgcheck=0
name=hello
# 修改yum源文件内容
ansible test -m yum_repository -a "name=myyum description=hi baseurl=ftp://192.168.4.254/centos gpgcheck=no"
# 删除yum源文件myyum
ansible test -m yum_repository -a "name=myyum state=absent"
yum 模块
安装、卸载、升级软件包
# 安装软件包
ansible test -m yum -a "name=unzip state=present"
# 升级软件包, 软件名称可以是*,代表升级所有软件包
ansible test -m yum -a "name=unzip state=latest"
# 卸载unzip软件包
ansible test -m yum -a "name=unzip state=absent"

service 模块
启动、关闭、重启服务、设置开机启动
- state:started|stopped|restarted
- enabled:yes 设置开机启动
# 启动test组的httpd服务
ansible test -m service -a "name=httpd state=started"
# 停止test组的httpd服务
ansible test -m service -a "name=httpd state=stopped"
# 重启test组的httpd服务
ansible test -m service -a "name=httpd state=restarted"
# 设置test组的httpd服务开机自启, enabled的值可以填写 (yes|no|true|false)
ansible test -m service -a "name=httpd enabled=yes"
lvg 模块
创建、删除卷组(VG),修改卷组大小
state:present(创建)| absent(删除)
# 安装lvm2软件包
ansible test -m yum -a "name=lvm2"
# 创建名称为myvg的卷组,该卷组由/dev/vdb1组成
ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1"
# 修改卷组大小
ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
给虚拟机增加一块硬盘

使用parted进行分区,第一步可以使用parted /dev/sdb mklabel gpt

使用 /dev/sdb1 创建卷组 myvg

修改卷组,增加 /dev/sdb2

lvol 模块
创建、删除逻辑卷(LV),修改逻辑卷大小
- state:present(创建)| absent(删除)
# 使用myvg这个卷组创建一个名称为mylv的逻辑卷
ansible test -m lvol -a "lv=mylv vg=myvg size=2G"
# 修改LV逻辑卷大小
ansible test -m lvol -a "lv=mylv vg=myvg size=4G"
# 删除逻辑卷
ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"
# 删除卷组 myvg
ansible test -m lvg -a "vg=myvg state=absent"

删除逻辑卷

删除卷组

setup 模块
- ansible_facts 用于采集被管理设备的系统信息
- 所有收集的信息都被保存在变量中
- 每次执行playbook默认第一个任务就是Gathering Facts
- 使用setup模块可以查看收集到的facts信息

setup模块可以查看到以下信息(有父子关系时使用.分隔):
- ansible_all_ipv4_address
- ansible_bios_version
- ansible_memtotal_mb
- ansible_hostname
- ansible_devices.vda.partitions.vda1.size
可以使用参数进行过滤:ansible agent -m setup -a "filter=*ipv4*"

debug 模块
debug 模块可以显示变量的值,可以辅助排错
debug 模块有两个参数,var(不需要加双括号)和msg(引用变量需要{{}})
在playbook中,通过debug模块可以显示特定的facts信息
1、获取信息 Gathering Facts >> 执行任务 test facts

2、使用debug模块,显示变量的值


使用场景
首先,ansible.cfg和hosts是这样的......
[root@node01 ansible]# cat ansible.cfg
[defaults]
inventory = ~/ansible/hosts
#forks = 5
#ask_pass = True
#remote_port = 22
#host_key_checking = False
[root@node01 ansible]# cat hosts
[master]
node01
[agent]
node02
node03
node04
[master:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
ansible_become_pass=123456
[agent:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
ansible_become_pass=123456
[cluster:children]
master
agent
1、查看agent组的内核版本

2、查看agent组防火墙运行状态

3、查看嵌套主机组cluster(即集群所有服务器)的network服务运行状态



浙公网安备 33010602011771号