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/主机名。
-
数字范围(适用于IP或有序列主机名)
bash语法: [组名] 主机名前缀[开始:结束:步长] # 步长可省略(默认为1) [webservers] 192.168.1.[10:11] [dbservers] 192.168.1.[12:14] -
字母范围(适用于有序主机名)
bash[logservers] log-[a:d] -
通配符匹配(模糊匹配主机名)
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
Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。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的,如果没有定义 name,action的值将会用作输出信息中标记特定的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配置文件文件发生改变了)这时候就可以用到handlers和notify了;
(当发生改动时)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