Ansible 变量

变量概述

变量提供了便捷的方式来管理Ansible playbook 的每一个项目中的动态值,比如nginx -1.6.3 这个软件包的版本,在其他地方或许会反复使用,那么如果将此值设置为变量,然后在其他的playbook 中调用,会方便很多,方便维护,减少维护的成本。

定义变量的方式

  1. 通过命令行进行变量定义
  2. playbook,在play文件中进行变量定义
  3. 主机清单,通过主机信息文件中进行变量定义

如何定义变量

1.在playbook中定义变量

#方法一:
- hosts: db02
vars:
pkg:
- MySQL-python
- mariadb-server
tasks:
- name:
yum:
name: "{{ pkg }}"
state: present #方法二:
- hosts: db01
vars:
web_pkg: httpd
db_pkg:
- unzip
- vsftpd
php_pkg:
- php-fpm
- php
- php-mysql

2.使用vars_file定义变量

#定义阶段
[root@m01 project]# vim vars_file.yml
web_pkg: httpd
db_pkg: mariadb-server
php_pkg: php #调用阶段
[root@m01 project]# vim httpd.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install httpd
yum:
name: "{{ db_pkg }}"
state: present

3.使用Ansible内置变量

vim mkdri.yml
- hosts: web_group
tasks:
- name: MKDIR
file:
path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }}
state: directory
recurse: yes

4.使用主机清单定义变量 ,

注意: 主机的变量高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱

#定义阶段
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8 [web_group:vars]
web_pkg=nginx [backup_group]
backup ansible_ssh_host=172.16.1.41 [db_group]
db01 ansible_ssh_host=172.16.1.51
db02 ansible_ssh_host=172.16.1.52 [nfs_group]
nfs ansible_ssh_host=172.16.1.31 [rsync_server:children]
web_group
backup_group [rsync_server:vars]
web_pkg=httpd [nfs_server:children]
web_group
nfs_group #调用阶段
- hosts: zls_web01
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

5.官方推荐变量定义方式

值钱的几种变量定义都不是很好用,比较好用的是在Ansible 项目目录下创建两个变量目录:

host_vars

group_hosts

切记,目录名字一定要一致,不能做任何修改。

1.主机组定义变量

#定义阶段
#创建主机组变量定义目录
mkdir group_vars
[root@m01 ~]# vim group_vars/webs
web_pkg: httpd #定义阶段
[root@m01 ~]# cat group_vars/webs
web_pkg: httpd
#定义阶段
[root@m01 ~]# cat host_vars/zls_web01
web_pkg: nginx [root@m01 ~]# vim web.yml
- hosts: webs
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

6.命令行定义变量

通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用 --extra-vars 或者-e 设置变量

#调用阶段
[root@m01 ~]# !vim
vim web.yml
- hosts: webs
tasks:
- name: Install httpd Server
yum:
name:
- "{{ web_pkg }}" - name: Install mariadb Server
yum:
name:
- "{{ db_pkg }}" #定义阶段
[root@m01 ~]# ansible-playbook web.yml -e "web_pkg=vsftpd" -e "db_pkg=unzip"

Ansible变量优先级测试

定义阶段:

#定义playbook
[root@m01 ~]# vim test.yml
- hosts: webs
vars:
dir: playbook_vars
vars_files: ./vars_file.yml
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory
#定义vars_files
[root@m01 ~]# vim vars_file.yml
dir: vars_file
#定义host_vars中的web01
[root@m01 ~]# vim host_vars/zls_web01
dir: host_vars
#定义group_vars
[root@m01 ~]# vim group_vars/webs
dir: group_vars

测试阶段:

#1.命令行测试
[root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"
#查看到命令行定义的文件
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars #2.正常执行playbook
[root@m01 ~]# ansible-playbook test.yml #再次出现的是vars_files 定义的内容
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file #3.取消调用vars_files
[root@m01 ~]# vim test.yml
- hosts: webs
vars:
dir: playbook_vars
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory [root@m01 ~]# ansible-playbook test.yml
#再次出现的是playbook调用的
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file #4.取消playbook调用的
- hosts: webs
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory [root@m01 ~]# ansible-playbook test.yml

**结论: **

命令行 > vars_file > playbook vars > host_vars > group_vars

变量注册

ansible 的模块在运行之后,其实都会返回一些result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些return 返回值,我们才知道,上一步是否可以执行成功,但是,在默认情况下, ansible result 并不会显示出来,所以,我们可以把这些返回值存储到变量中,这样就可以调用对应的变量名,从而得到这些 result,这种将模块的返回值,写入到变量中的方法被称为变量注册。

debug模块常用参数:

msg : 调试输出的消息

var : 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

verbosity: debug的级别(默认是0级,全部显示)


示例:

变量注册"{{ list_dir }}"

#编写剧本
[root@m01 vars]# cat register.yml
- hosts: gjy_web01
tasks:
- name: test vars
shell: "ls -l /root"
register: list_dir - name: return result
debug:
msg: "{{ list_dir }}" #查看执行结果
[root@m01 vars]# ansible-playbook register.yml PLAY [gjy_web01] ******************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************
ok: [gjy_web01] TASK [test vars] ********************************************************************************************************************************************
changed: [gjy_web01] TASK [return result] ****************************************************************************************************************************************
ok: [gjy_web01] => {
"msg": {
"changed": true,
"cmd": "ls -l /root",
"delta": "0:00:00.008826",
"end": "2019-09-20 03:36:38.313543",
"failed": false,
"rc": 0,
"start": "2019-09-20 03:36:38.304717",
"stderr": "",
"stderr_lines": [],
"stdout": "total 8\n-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg\n-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.sh\ndrwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0",
"stdout_lines": [
"total 8",
"-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg",
"-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.sh",
"drwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0"
]
}
} PLAY RECAP **************************************************************************************************************************************************
gjy_web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ###############################################################################################
注意:rc就想当于命令行执行完命令,echo $? 的返回值,返回值为0 的时候证明执行成功
##############################################################################################

优化版,只输出自己想要的内容 "{{ list_dir['stdout_lines'] }}"

#调用stdout_lines ,只显示想要的内容
[root@m01 vars]# cat register.yml
- hosts: gjy_web01
tasks:
- name: test vars
shell: "ls -l /root"
register: list_dir - name: return result
debug:
msg: "{{ list_dir['stdout_lines'] }}"
#查看结果
[root@m01 vars]# ansible-playbook register.yml PLAY [gjy_web01] ******************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************
ok: [gjy_web01] TASK [test vars] ********************************************************************************************************************************************
changed: [gjy_web01] TASK [return result] ****************************************************************************************************************************************
ok: [gjy_web01] => {
"msg": [
"total 8",
"-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg",
"-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.sh",
"drwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0"
]
} PLAY RECAP **************************************************************************************************************************************************
gjy_web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

ansibl e层级定义变量

#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat #编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}" - name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}" - name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}" #官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}" - name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}" - name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}" #执行playbook
[root@m01 ~]# ansible-playbook test.yml PLAY [web_group] ***************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02] TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- hosts: webs
tasks:
- name: mem
file:
path: /opt/{{ ansible_facts['fqdn'] }}
#path: /root/{{ ansible_fqdn }}
state: directory

facts缓存

Ansible facts是在被管理追击上通过Ansible 自动采集发现的变量, facts 包含每台特定的主机信息。

比如:被控端的主机名,IP 地址,系统版本,CPU数量,内存状态,次盘状态等等。

facts使用场景 :

1.通过 facts 缓存检查CPU,来省城对应的nginx配置文件

2.通过 facts 缓存主机名,生成不同的zabbix 配置文件

3. 通过 facts 缓存检查物理机的内存大小来生成不同的mysql配置文件

综上所述的Ansible facts 类似于saltstack 中的 grains 对于做自动化非常有用的

facts 基本用法

#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: >
Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}" #执行
[root@m01 ~]# ansible-playbook facts.yml
[root@m01 ~]# ansible-playbook facts.yml PLAY [web_group] ***************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] TASK [Get Host Info] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": "Hostname \"web01\" and IP \"10.0.0.7\"\n"
}
ok: [web02] => {
"msg": "Hostname \"web02\" and IP \"10.0.0.8\"\n"
} PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

关闭facts

[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:

facts 生成zabbix配置文件

- hosts: web_group
vars:
- zabbix_server: 172.16.1.71
tasks:
- name: copy zabbix agent conf
template:
src: ./zabbix_agentd.conf
dest: /tmp/zabbix_agentd.conf

facts 生成mysqld 配置文件

- hosts: db_group
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present - name: copy mysql conf
template:
src: ./my.cnf
dest: /etc/my.cnf [root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}

Ansible--03 ansible 变量的更多相关文章

  1. ansible的主机变量

    ansible的主机变量(常用):ansible_ssh_host     #用于指定被管理的主机的真实IPansible_ssh_port     #用于指定连接到被管理主机的ssh端口号,默认是2 ...

  2. ansible中定义变量的若干方法

    Ansible支持十几种定义变量的方式 根据优先级排序的定义方式: Inventory变量 Host Facts变量 Playbook变量 Playbook提示变量 变量文件 命令行变量 1.Inve ...

  3. ansible基础-ansible角色的使用

    ansible基础-ansible角色的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...

  4. ansible配置文件 ansible.cfg的一点说明

    ansible配置文件 ansible.cfg的一点说明 > ansible --version ansible 2.1.1.0 config file = /etc/ansible/ansib ...

  5. 什么是 Ansible - 使用 Ansible 进行配置管理

    [注]本文译自:https://www.edureka.co/blog/what-is-ansible/   Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...

  6. Ansible Playbook 使用变量

    如何在 Playbook 中定义并使用变量: vars: - user: "test" # 定义变量 tasks: - name: create user user: name=& ...

  7. [转] Ansible 内置变量参考

    Quick reference for Ansible variables [From] https://github.com/lorin/ansible-quickref

  8. ansible取出register变量中最长字符串

    背景 在用ansible撰写一个etcd恢复的playbook时,有一个操作是获取etcd启动时的"initial-cluster"启动参数,该参数在etcd集群不同节点不一致,需 ...

  9. 【Ansible】ansible循环

    Ansible 循环 一.简单介绍 在ansible2.5之前,大多数人使”with_XXX”类型的关键字来操作循环,但是从2.6版本开始,官方推荐是”loop”关键字代替” with_XXX”. 1 ...

  10. Ansible配置文件ansible.cfg详解

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 此时外面小雨淅淅沥沥 ...

随机推荐

  1. Sass函数:数字函数-min()函数、max()函数

    min()函数 min() 函数功能主要是在多个数之中找到最小的一个,这个函数可以设置任意多个参数: >> min(1,2,1%,3,300%) 1% >> min(1px,2 ...

  2. java Random随机生成一个数

    package java05; import java.util.Random; /* Random随机生成一个数字 1.导包: import java.util.Random; 2.创建 Rando ...

  3. Python lambda 多变量

    >> x = list(map(lambda x, y: (x>3, y>0), (1,2,3,4,5), (0,1,2,3,4)))>>> x[(False ...

  4. mysql查找表名

    SELECT *FROM information_schema.TABLESWHERE 1=1 AND table_name LIKE '%order%' AND table_comment like ...

  5. python模块之numpy,pandas基本用法

    numpy: 是 Python 的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库简单来说:就是支持一维数组和多维数组的创建和操作,并有丰富的函数库. 直接看例子 ...

  6. 提高wifi速度的设置办法

    系列的提高wifi速度的设置办法 在DNS一栏有你们家的地址,在你们家的地址前输入“114.114.114.114”并以“,”结尾(注意:要用英文输入法哦.) 设置完后点击左上角的“无线局域网”回到初 ...

  7. myeclipse svn重新定位 本地文件 svn 重新定位

    我们在用工具myeclipse开发项目时,当资源库存储空间不够时,我们就需要添加资源库,涉及到我们切换项目资源库,下面就介绍一下svn资源库重新定位步骤 1,window到show view到othe ...

  8. 【BZOJ3052&UOJ58】糖果公园(树上带修莫队)

    题意:给定一个n个点的树,每个结点上有一种颜色c[i] 定义一条简单路径的偷税指数为simga (sigma w[i](i=0..a[j]))*v[j](j=0..m),其中a[i]为第i种颜色在路径 ...

  9. 本地项目关联到远程git仓库

    本地项目关联到远程git仓库 场景是这样的:在gitee-code上新建一个项目,gitee会帮你把项目初始化,初始化之后会根据你的选择生成默认的说明文件和gitignore文件.这个时候你就可以复制 ...

  10. Visible Lattice Points

    题目链接 题意:给个N*N的矩形点,求在原点看去能看到多少个点 思路:除了(1,0),(0,1),(1,1)外其他点的xy都互质.所以求欧拉函数.fhi[i]从2加到n,再是两倍,再加3. #incl ...