ansible自动化入门基础

ansible自动化入门基础

一、ansible介绍

Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible 具有多个重要的优点:

跨平台支持:Ansible 提供Linux、Windows、UNIX和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。

人类可读的自动化:Ansible Playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。

完美描述应用:可以通过 Ansible Playbook进行每种更改,并描述和记录应用环境的每一个方面。

轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制系统中。

支持动态清单:可以从外部来源动态更新 Ansible 管理的计算机列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。

编排可与其他系统轻松集成:能够利用环境中现有的 HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到 Ansible 工作流中。

二、Ad-Hoc模式

Ad-Hoc命令是ansible提供的一种快速执行简单任务的命令行工具,它允许用户在不编写完整playbook的情况下直接执行单条命令,

基本语法

bash 复制代码
ansible <host-pattern> -m <module-name> -a '<module-aguments>'[options]

host-pattern:指定目标主机或主机组(如:all、webservers、192.168.1.*)

模块 -m:指定要使用的ansible模块

模块参数 -a:传递给模块的参数

选项 全称 作用 示例
-i <路径> --inventory 指定自定义Inventory文件 -i /etc/ansible/my_hosts.ini
-m <模块> --module-name 指定要使用的模块(command、shell、copy等) -m shell
-a '<参数>' --args 传递给模块的参数 -a 'ls -l /tmp'
-u <用户名> --user 指定ssh连接用户 -u root
-k --ask-pass 提示输入ssh密码(默认密码认证失败时使用) -k
-b --become 使用特权升级(如:sudo) -b
-K --ask-become-pass 提示输入特权密码(如sudo密码) -K
--become-user=<用户> - 指定特权升级的目标用户(需配合-b) --become-user=pastgres
-f <数量> --forks 设置并执行的主机数(默认5) -f 10
-l <主机模式> -- limit 限制执行的主机范围(支持通配符) -l 'web*'
-v /-vv /-vvv --verbose 输出详细日志, -vv
--list-hosts - 仅列出匹配的主机,不执行命令 --list-hosts
--check - 模拟执行(Dry Run)不实际修改系统 --check
--diff - 显示文件变更的差异(常用于copy / template模块) --diff
-e '<变量>' --extra-vars 设置额外变量(支持JSON / YAML格式) -e "user=admin"
-o --one-line 简化输入为单行格式 -o
-B <秒数> --background 后台异步执行任务(需配合-P轮询) -B 3600 -P 60
-t <目录> --tree 将输出结果保存为指定目录(按主机名分文件) -t /tmp/ansible-logs

示例:

bash 复制代码
ansible all -m yum -a "name=vim-enhanced state=present"
# name:包的名称
# state=present:表示安装
&&
yum install -y vim

ansible命令中的-m yum等同于shell命令中的yum命令

ansible命令中的-a state=present等同于shell命令中的install

ansible命令中的-a name=vim-enhanced等同于shell命令中的vim

ansible主机清单(静态)

主机清单(Inventory)是ansible的核心配置文件,用于定义管理哪些主机以及如何分组。一个主机可以隶属于多个不同的组。

默认主机清单文件路径:/etc/ansible/hosts (有/etc/ansible/ansible.cfg定义)或通过-i指定自定义文件。

主机清单基本规则:

  • 主机组以[header]开头,这是主机组的名称
  • 可以使用主机名/域名或者IP地址标识目标主机
  • 没有分组的主机需要在所有的主机组之前定义

默认组

即使主机清单中没有定义任何组,ansible也会创建两个默认组:

all:该默认组包含所有主机

ungrouped:该组包含单独的主机

bash 复制代码
192.168.1.100

[webservers]
192.168.1.101
192.168.1.102

[dbservers]
192.168.1.103
192.168.1.104

嵌套组(父子组)

在ansible中,可以通过父子组(嵌套组)对主机进行分层管理,实现变量继承和批量操作。嵌套组可以嵌套很多个层级。

父组的变量会自动传递到子组,而子组可以覆盖父组的变量(优先级最高)。

在主机清单文件中,用:children定义父组,用普通组名作为子组

bash 复制代码
[webservers]
192.168.1.100
192.168.1.101

[dbservers]
192.168.1.102
192.168.1.103

[production:children]
webservers
dbservers

查看当前组的嵌套关系:

bash 复制代码
ansible-inventory --graph
@all:
	|--@production:
	|  |--@webservers:
	|  |  |--192.168.1.100
	|  |  |--192.168.1.101
	|  |--@dbservers:
	|  |  |--192.168.1.102
	|  |  |--192.168.1.103
	|  |--@ungrouped:

定义主机范围

在主机清单中可以通过数字范围、字母范围、通配符批量定义主机,避免逐个列出IP/主机名。

  1. 数字范围(适用于IP或有序列主机名)

    bash 复制代码
    语法:
    [组名]
    主机名前缀[开始:结束:步长]		# 步长可省略(默认为1)
    
    [webservers]
    192.168.1.[10:11]
    
    [dbservers]
    192.168.1.[12:14]
  2. 字母范围(适用于有序主机名)

    bash 复制代码
    [logservers]
    log-[a:d]
  3. 通配符匹配(模糊匹配主机名)

    bash 复制代码
    [allservers]
    *.example.com		# 匹配所有以.example.com	结尾的主机

三、ansible模块

ansible-doc命令
bash 复制代码
# 列出所有的ansible支持的模块
ansible-doc -l | grep command

# 查看某个模块的具体用法参数
ansible-doc -s command
command模块

command模块是ansible的默认模块,可以省略不写。

  • 使用command模块,不得出现shell变量$name也不得出现特殊符号> < | ; &等。

作用:在远程节点上执行一个命令

参数 说明
chdir 在执行之前,先通过cd进入该参数指定的目录
creates 在创建一个文件之前,判断该文件是否存在,如果存在则跳过前面的命令,如果不存在则执行前面的命令
free_form 该参数可以输入任何的系统命令,实现远程执行和管理
removes 定义一个文件是否存在,如果存在则执行前面的命令,如果不存在则跳过

1获取所有被管理机器的负载信息

bash 复制代码
ansible all -m command -a "uptime"

2让客户端机器,先切换到/tmp目录下,然后打印当前的工作目录

bash 复制代码
ansible all -m command -a "pwd chdir=/tmp"

3creates判断/opt文件夹是否存在,存在则不执行前面的pwd命令,不存在则执行

bash 复制代码
ansible all -m command -a "pwd creates=/opt"

4removes存在则执行,不存在则跳过

bash 复制代码
ansible all -m command -a "ls -l removes=/opt"
shell模块

在远程机器上执行命令(复杂的命令)

参数 说明
chdir 在执行之前,先通过cd进入该参数指定的目录
creates 定义一个文件是否存在,如果存在则跳过命令,如果不存在则执行命令
free_form 该参数可以输入任何的系统命令,实现远程执行和管理
removes 定义一个文件是否存在,如果存在则执行前面的命令,如果不存在则跳过

批量查询进程信息

bash 复制代码
ansible all -m shell -a "ps -ef | grep vim | grep -v grep"

批量在客户端机器创建写入文件信息

bash 复制代码
ansible all -m shell -a "echo hello > /tmp/hello.txt"
script模块

比起shell模块,script模块功能更强大,在管理机器上有一个脚本文件,就可以在所有被管理节点上去运行

bash 复制代码
[root@ansible ~]# ll /etc/ansible/scripts/
总用量 4
-rw-r--r--. 1 root root 61 9月   8 18:59 a.sh


[root@ansible ~]# ansible 172.16.103.129 -m script -a '/etc/ansible/scripts/a.sh &>/tmp/a'
172.16.103.129 | SUCCESS => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.16.103.129 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.16.103.129 closed."
    ],
    "stdout": "",
    "stdout_lines": []
}
file 模块

file模块是ansible中用于管理文件和目录的核心模块,可以创建文件、目录、符号链接、设置权限和属性等。

参数 说明 示例
path 文件/目录路径(别名:dest,name) path: /etc/foo.conf
state 状态:file,dirctory,link,hard,touch,absent state: directory
mode 权限(如0644) mode: '0644'
owner 文件所有者 owner:root
group 文件所属组 group: www-data
recurse 递归设置目录权限 recurse: yes
src 链接的源文件(当state=link或hard时) src: /etc/foo.conf
force 强制创建链接(当目标存在时) force: yes

touch:创建文件、更新时间戳

file:修改文件属性

示例:

1创建目录

bash 复制代码
ansible all -m file -a "path=/opt/dir state=directory"

2创建文件

bash 复制代码
ansible all -m file -a "path=/opt/dir/file1.txt state=touch"

3创建符号链接

bash 复制代码
ansible all -m file -a "src=/etc/hosts dest=/opt/dir/hosts_link state=link"

4删除文件或目录

bash 复制代码
# 删除目录
ansible all -m file -a "path=/opt/dir state=absent"

# 删除文件
ansible all -m file -a "path=/opt/dir/file1.txt state=absent"

5修改文件属性

bash 复制代码
# 修改文件权限
ansible all -m file -a "path=/opt/dir/file1.txt mode=0640 owner=root group=root"

# 递归修改目录权限
ansible all -m file -a "path=/opt/dir mode=0640 owner=root group=root recurse=yes"
user 模块

ansible的user模块用于管理系统用户账户,包括创建,修改和删除用户,以及管理用户属性如密码,组,家目录等。

参数 说明 示例
name 用户名(必需) name: testuser
state 用户状态:present(存在)absent(不存在) state: present
uid 用户UID uid:1001
group 用户主组 group:developers
groups 用户附加组列表 groups: wheel,devops
home 用户家目录路径 home: /home/testuser
shell 用户默认shell shell: /bin/bash
comment 用户描述信息 comment: "Test user"
password 用户密码(加密后的) password: $!@3123
generate_ssh_key 是否生成SSH密钥 generate_ssh_key: yes
ssh_key_type SSH密钥类型 ssh_key_type: rsa
ssh_key_file SSH密钥文件路径 ssh_key_file: .ssh/id_rsa
system 是否为系统用户 system:yes
create_home 是否创建加目录 create_home: no

示例

创建用户

bash 复制代码
ansible all -m user -a "name=testuser state=present shell=/sbin/nologin group=test groups=test1 home=/home/test create_home=yes"

删除用户

bash 复制代码
ansible all -m user -a "name=testuser state=absent remove=yes"
group 模块

group模块是ansible中用于管理系统用户组的核心模块,可以创建,修改和删除组

参数 说明 示例
name 组名(必需) developers
state 组状态:present/absent present
gid 指定组GID 1001
system 是否为系统组 yes

示例:

创建基本用户组

bash 复制代码
ansible all -m group -a "name=developers"

创建指定GID的组

bash 复制代码
ansible all -m group -a "name=deploy gid=1042"

创建系统组

bash 复制代码
ansible all -m group -a "name=dbadmin system=yes"

删除组

bash 复制代码
ansible all -m group -a "name-legacy state=absent"

修改组GID

bash 复制代码
ansible all -m group -a "name=appusers gid=1500"
yum 模块

yum模块是ansible中用于管理RHEL/CentOS/Fedora/openEuler等基于PRM的Linux系统中软件包的核心模块

参数 说明 示例
name 包名 httpd
state 状态:present/latest/absent latest
enablerepo 临时启用仓库 epel
disablerepo 临时禁用仓库 updates
exclude 排除的包 kernel
update_cache 更新元数据缓存 yes
list 列出包(不执行操作) httpd
security 仅安全更新 yes
download_only 仅下载不安装 yes

示例:

安装单个软件包

bash 复制代码
ansible all -m yum -a "name=httpd state=present"

安装最新版本

bash 复制代码
ansible all -m yum -a "name=nginx state=latest"

安装多个软件包

bash 复制代码
ansible all -m yum -a "name={'vim-enhanced','git',tmux} state=present"

删除软件

bash 复制代码
ansible all -m yum -a "name=telnet state=absent"

使用特定仓库安装

bash 复制代码
ansible all -m yum -a "name=htop enablerepo=epel state=present"

更新所有软件包

bash 复制代码
ansible all -m yum -a "name=* state=latest"

仅安全更新

bash 复制代码
ansible all -m yum -a "security=yes state=latest"

安装包组

bash 复制代码
ansible all -m yum -a "name='@development' state=present"

下载但不安装

bash 复制代码
ansible all -m yum -a "name=ansible download=yes"

使用URL安装RPM

bash 复制代码
ansible all -m yum -a "name=htps://***.rpm state=present" -b

排除特定包更新

bash 复制代码
ansible all -m yum -a "name=* state=latest exclude=kernel"

清理yum缓存

bash 复制代码
ansible all -m yum -a "clean=all"

列出可用更新

bash 复制代码
ansible all -m yum -a "list=updates"

检查包是否安装

bash 复制代码
ansible all -m yum 0-a "list=httpd"
copy 模块

copy模块是ansible中用于文件传输的核心模块,可以将本地文件复制到远程文件,或直接在远程主机上创建文件

参数 说明 示例
src 源文件路径(本地) /tmp/file.conf
dest 目标路径(远程) /etc/file.conf
content 直接写入的内容 "hello world"
owner 文件所有者 root
group 文件所属组 wheel
mode 文件权限 0644
backup 是否备份原文件 yes
force 是否强制覆盖 no
validate 更新前验证命令 "/usr/sbin/apachectl -t % s"

示例:

1基本文件复制

bash 复制代码
ansible webservers -m copy -a "src=/tmp/app.conf dest=/etc/app.conf"

2设置文件和所有者

bash 复制代码
ansible all -m copy -a "src=/tmp/script.sh dest=/usr/local/bin/script.sh owner=root group=root"

3直接创建文件内容

bash 复制代码
ansible all -m copy -a "content='DB_HOST=127.0.0.1' dest=/etc/db.conf "

4复制并备份源文件

bash 复制代码
ansible all -m copy -a "src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes"

5在单个主机上复制文件

bash 复制代码
ansible hostA -m copy -a "src=/path/to/source dest=/path/to/dest remote_src=yes"

6验证命令

bash 复制代码
# 检查文件是否存在
ansible all -m shell -a "ls -l /etc/app.conf" -b

# 检查文件内容
ansible all -m shell -a "cat /etc/motd" -b

# 检查备份文件
ansible all -m shell -a "ls -l /etc/nginx/nginx.conf.*" -b
service模块
bash 复制代码
name参数:此参数用于指定需要操作的服务名称,比如 nginx
state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded
enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动
bash 复制代码
//启动受控机上的vsftpd服务
[root@ansible ~]# ansible webservers -m service -a 'name=vsftpd state=started'
172.16.103.129 | SUCCESS => {
    "changed": true,
    "name": "vsftpd",
    "state": "started",
    "status": {
        "ActiveEnterTimestampMonotonic": "0",
        ....此处省略N行
}

//设置受控机上的vsftpd服务开机自动启动
[root@ansible ~]# ansible webservers -m service -a 'name=vsftpd enabled=yes'
172.16.103.129 | SUCCESS => {
    "changed": true,
    "enabled": true,
    "name": "vsftpd",
    "status": {
        "ActiveEnterTimestamp": "六 2018-09-08 00:02:39 EDT",
        ....此处省略N行
}

//停止受控机上的vsftpd服务
[root@ansible ~]# ansible 172.16.103.129 -m service -a 'name=vsftpd state=stopped'
172.16.103.129 | SUCCESS => {
    "changed": true,
    "name": "vsftpd",
    "state": "stopped",
    "status": {
        "ActiveEnterTimestamp": "六 2018-09-08 00:02:39 EDT",
        ....此处省略N行
}

四、playbook模式

ansible的playbook模式是针对比较具体且比较大的任务,应用场景:

  • 一键部署rsync备份服务器
  • 一键部署lnmp环境
bash 复制代码
#此工具用于执行编写好的 playbook 任务
#示例
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
    - name: hello world
      command: /usr/bin/wall hello world

Playbookad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstackstate状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

1、playbook核心元素
bash 复制代码
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,即使用模板语法的文件,比如配置文件等
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
2、playbook语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task
bash 复制代码
# 创建playbook文件
[root@ansible ~]# cat playbook01.yml
---                       #固定格式
- hosts: 192.168.1.31     #定义需要执行主机
  remote_user: root       #远程用户
  vars:                   #定义变量
    http_port: 8088       #变量

  tasks:                             #定义一个任务的开始
    - name: create new file          #定义任务的名称
      file: name=/tmp/playtest.txt state=touch   #调用模块,具体要做的事情
    - name: create new user
      user: name=test02 system=yes shell=/sbin/nologin
    - name: install package
      yum: name=httpd
    - name: config httpd
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:                 #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
        - restart apache      #notify要执行的动作,这里必须与handlers中的name定义内容一致
    - name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    - name: start httpd
      service: name=httpd state=started
  handlers:                                    #处理器:更加tasks中notify定义的action触发执行相应的处理动作
    - name: restart apache                     #要与notify定义的内容相同
      service: name=httpd state=restarted      #触发要执行的动作

#测试页面准备
[root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
#配置文件准备
[root@ansible ~]# cat httpd.conf |grep ^Listen
Listen {{ http_port }}

#执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
[root@ansible ~]# ansible-playbook playbook01.yml
PLAY [192.168.1.31] *********************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.1.31]
TASK [create new file] ******************************************************************************************
changed: [192.168.1.31]
TASK [create new user] ******************************************************************************************
changed: [192.168.1.31]
TASK [install package] ******************************************************************************************
changed: [192.168.1.31]
TASK [config httpd] *********************************************************************************************
changed: [192.168.1.31]
TASK [copy index.html] ******************************************************************************************
changed: [192.168.1.31]
TASK [start httpd] **********************************************************************************************
changed: [192.168.1.31]
PLAY RECAP ******************************************************************************************************
192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 


# 验证上面playbook执行的结果
[root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
192.168.1.31 | CHANGED | rc=0 >>
/tmp/playtest.txt
uid=990(test02) gid=985(test02) 组=985(test02)

[root@ansible ~]# curl 192.168.1.31:8088
<h1>playbook test file</h1>
3、playbook运行方式
bash 复制代码
[root@ansible PlayBook]# ansible-playbook -h
#ansible-playbook常用选项:
--check  or -C    #只检测可能会发生的改变,但不真正执行操作
--list-hosts      #列出运行任务的主机
--list-tags       #列出playbook文件中定义所有的tags
--list-tasks      #列出playbook文件中定义的所以任务集
--limit           #主机列表 只针对主机列表中的某个主机或者某个组执行
-f                #指定并发数,默认为5个
-t                #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v                #显示过程  -vv  -vvv更详细
4、playbook元素属性
主机与用户

在一个playbook开始时,最先定义的是要操作的主机和用户

bash 复制代码
---
- hosts: 192.168.1.31
  remote_user: root

除了上面的定义外,还可以在某一个tasks中定义要执行该任务的远程用户

bash 复制代码
tasks: 
  - name: run df -h
    remote_user: test
    shell: name=df -h

还可以定义使用sudo授权用户执行该任务

bash 复制代码
tasks: 
  - name: run df -h
    sudo_user: test
    sudo: yes
    shell: name=df -h
tasks任务列表

每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,如果没有定义 nameaction的值将会用作输出信息中标记特定的task

每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行这个被定义的tasks

bash 复制代码
tasks:
  - name: create new file
    file: path=/tmp/test01.txt state=touch
  - name: create new user
    user: name=test001 state=present
Handlers与notify

很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlersnotify了;

(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions只会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作只会被执行一次。

bash 复制代码
[root@ansible ~]# cat httpd.yml 
#用于安装httpd并配置启动
---
- hosts: 192.168.1.31
  remote_user: root

  tasks:
  - name: install httpd
    yum: name=httpd state=installed
  - name: config httpd
    template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
      - restart httpd
  - name: start httpd
    service: name=httpd state=started

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify。
playbook文件中定义变量

编写playbook时,直接在里面定义变量,然后直接引用,可以定义多个变量;注意:如果在执行playbook时,又通过-e参数指定变量的值,那么会以-e参数指定的为准。

bash 复制代码
# 编辑playbook
[root@ansible PlayBook]# cat variables.yml 
---
- hosts: all
  remote_user: root
  vars:                #定义变量
    pkg: nginx         #变量1
    dir: /tmp/test1    #变量2

  tasks:
    - name: install pkg
      yum: name={{ pkg }} state=installed    #引用变量
    - name: create new dir
      file: name={{ dir }} state=directory   #引用变量


# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml

# 如果执行时候又重新指定了变量的值,那么会已重新指定的为准
[root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml
独立的变量yaml文件中定义

为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,playbook文件直接引用文件调用变量即可。

bash 复制代码
# 定义存放变量的文件
[root@ansible PlayBook]# cat var.yml 
var1: vsftpd
var2: httpd

# 编写playbook
[root@ansible PlayBook]# cat variables.yml 
---
- hosts: all
  remote_user: root
  vars_files:    #引用变量文件
    - ./var.yml   #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)

  tasks:
    - name: install package
      yum: name={{ var1 }}   #引用变量
    - name: create file
      file: name=/tmp/{{ var2 }}.log state=touch   #引用变量


# 执行playbook
[root@ansible PlayBook]# ansible-playbook  variables.yml
playbook标签

一个playbook文件中,执行时如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行,还可以通过--skip-tags选择除了某个标签外全部执行等。

bash 复制代码
# 编辑playbook
[root@ansible PlayBook]# cat httpd.yml 
---
- hosts: 192.168.1.31
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd state=installed
      tags: inhttpd

    - name: start httpd
      service: name=httpd state=started
      tags: sthttpd

    - name: restart httpd
      service: name=httpd state=restarted
      tags: 
        - rshttpd
        - rs_httpd

# 正常执行的结果
[root@ansible PlayBook]# ansible-playbook httpd.yml 

PLAY [192.168.1.31] **************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.1.31]

TASK [install httpd] *************************************************************************************************************************
ok: [192.168.1.31]

TASK [start httpd] ***************************************************************************************************************************
ok: [192.168.1.31]

TASK [restart httpd] *************************************************************************************************************************
changed: [192.168.1.31]

PLAY RECAP ***********************************************************************************************************************************
192.168.1.31               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

通过 -t 选项指定 tags 进行执行

bash 复制代码
# 通过-t指定tags名称,多个tags用逗号隔开
[root@ansible PlayBook]# ansible-playbook -t rshttpd httpd.yml 

PLAY [192.168.1.31] **************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.1.31]

TASK [restart httpd] *************************************************************************************************************************
changed: [192.168.1.31]

PLAY RECAP ***********************************************************************************************************************************
192.168.1.31               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

通过 --skip-tags 选项排除不执行的 tags

bash 复制代码
[root@ansible PlayBook]# ansible-playbook --skip-tags inhttpd httpd.yml 

PLAY [192.168.1.31] **************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.1.31]

TASK [start httpd] ***************************************************************************************************************************
ok: [192.168.1.31]

TASK [restart httpd] *************************************************************************************************************************
changed: [192.168.1.31]

PLAY RECAP ***********************************************************************************************************************************
192.168.1.31               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
相关推荐
2501_946205522 小时前
自动化设备常用滚珠丝杠厂家排名,哪家适配性更出色
运维·自动化
im_AMBER2 小时前
前端 + agent 开发学习路线
前端·学习·agent
思茂信息2 小时前
CST电动汽车EMC仿真(三)——初探轴电压
运维·服务器·单片机·嵌入式硬件·cst·电磁仿真·天线仿真
实战项目2 小时前
集群负载均衡关键技术研究
运维·负载均衡
未定义.2212 小时前
第1篇:0基础入门!Python+Selenium环境搭建与第一个自动化脚本
python·功能测试·selenium·自动化·jenkins·pytest
名字不相符2 小时前
2026年1月13日NSSCTF之[WUSTCTF 2020]level2
学习·萌新
浩瀚地学2 小时前
【Java】集合-Collection
java·开发语言·经验分享·笔记·学习
2501_941982052 小时前
企业微信外部群自动化:基于 RPA 的复杂架构设计与稳定性实战
自动化·企业微信·rpa
JZC_xiaozhong2 小时前
企业多系统审批流程如何打通?一文详解跨系统流程自动化方案
运维·自动化·流程自动化·数据集成与应用集成·业务流程管理·流程设计可视化·流程监控