目录
ansible
ansible管理
adhoc临时命令
ansible模块
command模块
shell模块
script模块
file模块
copy模块
fetch模块
lineinfile模块
replace模块
问题:
Ansible哪个模块可以自动配置YUM源?
yum_repository
service模块
Playbook剧本
YAML
编写playbook
问题:
在YAML文件中使用什么符号支持跨行文本
在Ansible的Playbook剧本中使用什么关键词定义任务?
YAML文件中用什么代表数组,什么代表kv数据?
简单描述ansible_facts的作用?
ansible变量
facts变量
自定义变量
触发执行任务
问题:
Ansible使用什么语句实现循环功能?
Ansible使用什么关键词可以定义任务块?
ansible
是一款自动化运维工具,基于python开发,批量管理服务器的工具
首次发布于2012年,2015年被红帽公司收购
使用Python语言编写的
基于ssh进行管理,所以不需要在被管端安装任何软件
ansible在管理远程主机的时候,主要是通过各种模块进行操作的
ansible进行远程管理的两个方法:
adhoc临时命令。就是在命令行上执行管理命令。
playbook剧本。把管理任务用特定格式写到文件中。
无论哪种方式,都是通过模块加参数进行管理。
语法:
ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
# 列出ansible的所有模块数量
[root@control ansible]# ansible-doc -l | wc -l
2834
# 列出ansible的所有模块
[root@control ansible]# ansible-doc -l
# 查看与yum相关的模块
[root@control ansible]# ansible-doc -l | grep yum
# 查看yum模块的使用说明,主要查看下方的EXAMPLE示例
[root@control ansible]# ansible-doc yum
ansible默认模块,用于在远程主机上执行任意命令
command不支持shell特性,如管道、重定向。
# 在所有被管主机上创建目录/tmp/demo
[root@control ansible]# ansible all -a "mkdir /tmp/demo"
# 查看node1的ip地址
[root@control ansible]# ansible node1 -a "ip a s"
[root@control ansible]# ansible node1 -a "ip a s | head" # 报错
与command模块类似,但是支持shell特性,如管道、重定向。
# 查看node1的ip地址,只显示前10行
[root@control ansible]# ansible node1 -m shell -a "ip a s | head"
用于在远程主机上执行脚本
# 在控制端创建脚本即可
[root@control ansible]# vim test.sh
#!/bin/bash
yum install -y httpd
systemctl start httpd
# 在test组的主机上执行脚本
[root@control ansible]# ansible test -m script -a "test.sh"
可以创建文件、目录、链接等,还可以修改权限、属性等
常用的选项:
path:指定文件路径
owner:设置文件所有者
group:设置文件所属组
state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除
mode:设置权限
src:source的简写,源
dest:destination的简写,目标
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touch" # touch是指如果文件不存在,则创建
# 在test主机上创建/tmp/demo目录
[root@control ansible]# ansible test -m file -a "path=/tmp/demo state=directory"
# 将test主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"
[root@control ansible]# ansible test -a "ls -l /tmp/file.txt"
# 删除test主机上/tmp/file.txt
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=absent" # absent英文缺席的、不存在的
# 删除test主机上/tmp/demo
[root@control ansible]# ansible test -m file -a "path=/tmp/demo state=absent"
# 在test主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
[root@control ansible]# ansible test -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
用于将文件从控制端拷贝到被控端
常用选项:
src:源。控制端的文件路径
dest:目标。被控制端的文件路径
content:内容。需要写到文件中的内容
[root@control ansible]# echo "AAA" > a3.txt
# 将a3.txt拷贝到test主机的/root/
[root@control ansible]# ansible test -m copy -a "src=a3.txt dest=/root/"
# 在目标主机上创建/tmp/mytest.txt,内容是Hello World
[root@control ansible]# ansible test -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
与copy模块相反,copy是上传,fetch是下载
常用选项:
src:源。被控制端的文件路径
dest:目标。控制端的文件路径
# 将test主机上的/etc/hostname下载到本地用户的家目录下
[root@control ansible]# ansible test -m fetch -a "src=/etc/hostname dest=~/"
[root@control ansible]# ls ~/node1/etc/ # node1是test组中的主机
hostname
用于确保存目标文件中有某一行内容
常用选项:
path:待修改的文件路径
line:写入文件的一行内容
regexp:正则表达式,用于查找文件中的内容
# test组中的主机,/etc/issue中一定要有一行Hello World。如果该行不存在,则默认添加到文件结尾
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='Hello World'"
# test组中的主机,把/etc/issue中有Hello的行,替换成chi le ma
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"
lineinfile会替换一行,replace可以替换关键词
常用选项:
path:待修改的文件路径
replace:将正则表达式查到的内容,替换成replace的内容
regexp:正则表达式,用于查找文件中的内容
# 把test组中主机上/etc/issue文件中的chi,替换成he
[root@control ansible]# ansible test -m replace -a "path=/etc/issue regexp='chi' replace='he'"
yum_repository模块
用于配置yum
常用选项:
file: 指定文件名
其他选项,请与文件内容对照
# 在test组中的主机上,配置yum
[root@control ansible]# ansible test -m yum_repository -a "file=myrepo name=myApp description='My App' baseurl=ftp://192.168.4.254/rhel8/AppStream gpgcheck=no enabled=yes"
[root@node1 ~]# cat /etc/yum.repos.d/myrepo.repo
[myApp]
baseurl = ftp://192.168.4.254/rhel8/AppStream
enabled = 1
gpgcheck = 0
name = My App
[root@control ansible]# ansible test -m yum_repository -a "file=myrepo name=BaseOS description='Base OS' baseurl=ftp://192.168.4.254/rhel8/BaseOS gpgcheck=no enabled=yes"
用于控制服务。启动、关闭、重启、开机自启。
常用选项:
name:控制的服务名
state:started表示启动;stopped表示关闭;restarted表示重启
enabled:yes表示设置开机自启;no表示设置开机不要自启。
# 在test主机上安装httpd
[root@control ansible]# ansible test -m yum -a "name=httpd state=latest"
# 在test主机上启动httpd,并设置它开机自启
[root@control ansible]# ansible test -m service -a "name=httpd state=started enabled=yes"
常用于复杂任务的管理,以及管理经常要完成的任务
playbook也是通过模块和它的参数,在特定主机上执行任务
playbook是一个文件,该文件中需要通过yaml格式进行书写
YAML Ain't a Markup Language:YAML不是一个标记语言
是一个可读性高,用来表达数据序列的格式语言
yaml语法规范
yaml文件的文件名,一般以yml或yaml作为扩展名
文件一般以---作为第一行,不是必须的,但是常用
键值对使用冒号:表示,冒号后面必须有空格。
数组使用-表示,-后面必须有空格。
相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格。
全文不能使用tab,必须使用空格。
配置vim适应yaml语法
# 文件位置和名字是固定的,用于设置vim的格式
[root@control ansible]# vim ~/.vimrc
set ai # 设置自动缩进
set ts=2 # 设置按tab键,缩进2个空格
set et # 将tab转换成相应个数的空格
一个剧本(即playbook),可以包含多个play
每个play用于在指定的主机上,通过模块和参数执行相应的任务
每个play可以包含多个任务。
任务有模块和参数构成。
# 编写用于测试连通性的playbook,相当于执行ansible all -m ping
[root@control ansible]# vim test.yml
---
- name: test network # play的名字,可选项
hosts: all # 作用于所有的主机
tasks: # 任务
- name: task 1 # 第1个任务的名字,可选项
ping: # 第1个任务使用的模块
[root@control ansible]# ansible-playbook test.yml # 执行playbook
硬盘管理
常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)
MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘
GPT最多支持128个主分区。支持大硬盘
parted模块
用于硬盘分区管理
常用选项:
device:待分区的设备
number:分区编号
state:present表示创建,absent表示删除
part_start:分区的起始位置,不写表示从开头
part_end:表示分区的结束位置,不写表示到结尾
# 在test组中的主机上,对/dev/vdc进行分区,创建1个1GB的主分区
[root@control ansible]# vim disk.yml
---
- name: disk manage
hosts: test
tasks:
- name: create a partition
parted:
device: /dev/vdc
number: 1
state: present
part_end: 1GiB
[root@control ansible]# ansible-playbook disk.yml
> 或者 |
tasks
-代表数组
:代表kv数据
ansible_facts用于采集被管理设备的系统信息
所有收集的信息都被保存在变量中
每次执行playbook默认第一个任务就是Gathering Facts
使用setup模块可以查看收集到的facts信息
facts翻译过来就是事实。
facts变量是ansible自带的预定义变量,用于描述被控端软硬件信息。
facts变量通过setup模块获得。
# 通过setup模块查看所有facts变量
[root@control ansible]# ansible test -m setup
facts变量是一个大的由{}构成的键值对字典。在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容。
# 查看所有的IPV4地址,filter是过滤的意思
[root@control ansible]# ansible test -m setup -a "filter=ansible_all_ipv4_addresses"
# 查看可用内存
[root@control ansible]# ansible test -m setup -a "filter=ansible_memfree_mb"
常用的facts变量
ansible_all_ipv4_addresses:所有的IPV4地址
ansible_bios_version:BIOS版本信息
ansible_memtotal_mb:总内存大小
ansible_hostname:主机名
引入变量,可以方便Playbook重用。比如装包的playbook,包名使用变量。多次执行playbook,只要改变变量名即可,不用编写新的playbook。
ansible支持10种以上的变量定义方式。常用的变量来源如下:
inventory变量。变量来自于主机清单文件
facts变量。
playbook变量。变量在playbook中定义。
变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。
通过handlers定义触发执行的任务
handlers中定义的任务,不是一定会执行的
在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行
只有tasks中的任务状态是changed才会进行通知。
loop语句
block