ansible模块与playbook模块

目录

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模块与playbook模块_第1张图片

ansible管理

  • ansible进行远程管理的两个方法:

    • adhoc临时命令。就是在命令行上执行管理命令。

    • playbook剧本。把管理任务用特定格式写到文件中。

  • 无论哪种方式,都是通过模块加参数进行管理。

adhoc临时命令

语法:

ansible 主机或组列表 -m 模块 -a "参数"    # -a是可选的

ansible模块

# 列出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

command模块

  • 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"   # 报错

shell模块

与command模块类似,但是支持shell特性,如管道、重定向。

# 查看node1的ip地址,只显示前10行
[root@control ansible]# ansible node1 -m shell -a "ip a s | head"

script模块

用于在远程主机上执行脚本

# 在控制端创建脚本即可
[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"

file模块

  • 可以创建文件、目录、链接等,还可以修改权限、属性等

  • 常用的选项:

    • 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"

copy模块

  • 用于将文件从控制端拷贝到被控端

  • 常用选项:

    • 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"

fetch模块

  • 与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

lineinfile模块

  • 用于确保存目标文件中有某一行内容

  • 常用选项:

    • 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'"

replace模块

  • 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'"

问题:

Ansible哪个模块可以自动配置YUM源?

yum_repository模块

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"

service模块

  • 用于控制服务。启动、关闭、重启、开机自启。

  • 常用选项:

    • 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也是通过模块和它的参数,在特定主机上执行任务

  • playbook是一个文件,该文件中需要通过yaml格式进行书写

YAML

  • YAML Ain't a Markup Language:YAML不是一个标记语言

  • 是一个可读性高,用来表达数据序列的格式语言

yaml语法规范

  1. yaml文件的文件名,一般以yml或yaml作为扩展名

  2. 文件一般以---作为第一行,不是必须的,但是常用

  3. 键值对使用冒号:表示,冒号后面必须有空格。

  4. 数组使用-表示,-后面必须有空格。

  5. 相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格。

  6. 全文不能使用tab,必须使用空格。

配置vim适应yaml语法

# 文件位置和名字是固定的,用于设置vim的格式
[root@control ansible]# vim ~/.vimrc
set ai        # 设置自动缩进
set ts=2      # 设置按tab键,缩进2个空格
set et        # 将tab转换成相应个数的空格

编写playbook

  • 一个剧本(即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

问题:

在YAML文件中使用什么符号支持跨行文本

> 或者 |

在Ansible的Playbook剧本中使用什么关键词定义任务?

tasks

YAML文件中用什么代表数组,什么代表kv数据?

  1. -代表数组

  2. :代表kv数据

简单描述ansible_facts的作用?

  • ansible_facts用于采集被管理设备的系统信息

  • 所有收集的信息都被保存在变量中

  • 每次执行playbook默认第一个任务就是Gathering Facts

  • 使用setup模块可以查看收集到的facts信息

ansible变量

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才会进行通知。

问题:

Ansible使用什么语句实现循环功能?

loop语句

Ansible使用什么关键词可以定义任务块?

block

你可能感兴趣的:(ansible,服务器,运维)