一、在Inventory中定义变量

详见《Ansible2:主机清单》

二、在Playbook中定义变量

1、通过vars关键字定义:

vars:

http_port: 80

server_name: localhost

cert_file: /etc/nginx/ssl/nginx.crt

key_file: /etc/nginx/ssh/nginx.key

conf_file: /etc/nginx/conf/default.conf

2、通过vars_files关键字引入变量文件:

- hosts: all

remote_user: root

vars:

favcolor: blue

vars_files:

- /vars/external_vars.yml

- /vars/nginx_vars.yml

/vars/nginx_vars.yml示例:

http_port: 80

server_name: localhost

cert_file: /etc/nginx/ssl/nginx.crt

key_file: /etc/nginx/ssh/nginx.key

conf_file: /etc/nginx/conf/default.conf

3、通过vars_prompt来实现人机交互:

hosts: all

remote_user: root

vars_prompt:

- name: 'https_passphrase'          #存储数据的变量名

prompt: 'Key Passphrase'          #手工输入数据

private: yes                      #当该值为yes,则用户的输入不会被打印

4、通过playbook的roles定义变量

详见《ansible10:Playbook的角色与包含》

三、注册变量

在有些时候,我们希望把某一条任务执行的结果保存下来,可以在接下的任务中调用或者做些判断,可以通过register关键字来实现:
 hosts: alltasks:- shell: cat /etc/motdregister: motd_contents- shell: echo "motd contains the word hi"when: motd_contents.stdout.find('hi') != -1下面是一个register的变量在循环中使用的例子:- name: registered variable usage as a with_items listhosts: alltasks:- name: retrieve the list of home directoriescommand: ls /homeregister: home_dirs- name: add home dirs to the backup spoolerfile: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=linkwith_items: home_dirs.stdout_lines# same as with_items: home_dirs.stdout.split()

四、通过fact获取远程主机变量

我们在之前讲ad-hoc常用模块的时候提到setup模块,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用。而setup模块获取这些信息的方法就是依赖于fact。在这里,我们不再详细说明获取到的默认fact的内容。ansible除了能获取到预定义的fact的内容,还支持手动为某个主机定制fact。称之为本地fact。本地fact默认存放于目标主机的/etc/ansible/facts.d目录下,如果文件为.ini格式或者json格式,ansible会自动识别。以这种形式加载的fact是key为ansible_local的特殊变量。

下面是一个简单的示例,一个.ini格式的example.fact文件内容如下:

[book]

title=Ansible Book

author=Breeze Yan

将其复制到目标主机的/etc/ansible/facts.d/目录,通过debug模块打印输出:

- name: print ansible_local

debug: var=ansibl_local

会打印出如下内容:

ok: [localhost] => {

"var": {

"ansible_local": {

"example": {

"book": {

"author": "Breeze Yan",

"title": "Ansible Book"

}

}

}

}

}

如果不想从fact中获取变量,可以通过如下方法关闭fact:

- hosts: whatever

gather_facts: no

五、使用set_fact模块定义新的变量

在《ansible7:Playbook常用模块》中有对set_fact模块用法的详细说明

六、内置变量

1、hostvars

获取某台指定的主机的相关变量。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为db.exmaple.com,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:

{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}

需要注意的是db.example.com不能使用ip地址来取代,只能使用主机名或别名。

2、inventory_hostname与inventory_hostname_short

inventory_hostname是Ansible所识别的当前正在运行task的主机的主机名。如果在inventory里定义过别名,那么这里就是那个别名,如果inentory包含如下一行:

server1 ansible_ssh_host=192.168.1.1

则inventory_hostname即为server1

利用hostvars和inventory_hostname变量,可以输出与当前主机相关联的所有变量:

- debug: var=hostvars[inventory_hostname]

与inventory_hostname相近的还有一个inventory_hostname_short,如果一台主机的inventory_hostname为server1.exmaple.com,则inventory_hostname_short的值为server1

3、group_names

用于标识当前正在执行task的目标主机位于的主机组。假如我们有三台主机,用来配置成一主二从的mysql服务器。inventory配置如下:

[mdb]

db1

[sdb]

db2

db3

mysql配置文件my.conf.j2示例如下:

{% if 'db1' in group_names %}

[mysqld]

server-id=1

log-bin=mysql-bin

log-bin-index=mysql-bin.index

sync-binlog=1

innodb_flush_log_at_trx_commit=1    #我们知道db1在mdb组,当db1与当前执行c一组时,我们认为当前主机即在mdb组,所以对当前主机应用mysql master的配置

{% else %}

[mysqld]

server-id=2

relay-log=relay-log

relay-log-index=relay-log.index

read-only = yes

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

relay_log_recovery = 1

skip_slave_start    #当db1与当前主机不在同一组时,则认为当前主机不在mdb组,即应用my slave的配置

{% endif %}

我们执行如下task:

- name: copy config file to mysql master

template: src=my.conf.j2 dest=/etc/my.cnf

4、groups

当你想要访问一组主机的变量时,groups变量会很有用。假如我们有一个inventory文件定义如下:

[web]

server1

server2

在配置一台HAproxy的负载均衡器时,我们的配置文件肯定需要web群组的所有服务器的IP,配置文件包含如下片段:

backend web-backend

{% for host in groups.web%}

server `host`.`inventory_hostname` ` host`.`ansible_default_ipv4`.`address `:80

{% endfor %}

最终生成的文件如下:

backend web-backend

server server1 192.168.1.1

server server2 192.168.1.2

再给一个例子,在所有的dbservers组的服务器上创建一个数据库用户kate:

- name: Create a user for all db servers

mysql_user: name=kate password=test host={{ hostvars.[item].ansible_eth0.ipv4.address }} state=present

with_items: groups['dbservers']

5、play_hosts    #当前playbook会在哪些hosts上运行

6、ansible_version    #当前ansible的版本

7、inventory_dir    #主机清单所在目录

8、inventory_file    #主机清单文件

七、通过命令行设置变量

示例如下:

---

- hosts: '` hosts `'

remote_user: '` user `'

tasks:

- ...

ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"

也可以写成类似如下方式:

--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'

为了方便调试,ansible提供了debug模块来很方便的查看模块。用法可以参考通过fact获取主机变量中的打印本地fact的示例九、变量优先级
1、extra vars(命令中-e)最优先2、inventory 主机清单中连接变量(ansible_ssh_user 等)3、play 中 vars、vars_files 等4、剩余的在 inventory 中定义的变量5、系统的 facts 变量6、角色定义的默认变量(roles/rolesname/defaults/main.yml)注:子组会覆盖父组,主机总是覆盖组定义的变量

本文出自 “无名小卒” 博客,请务必保留此出处http://breezey.blog.51cto.com/2400275/1757734

转载于:https://blog.51cto.com/visitor/1957283

Ansible11:变量详解相关推荐

  1. php之static静态变量详解

    php之static静态变量详解 一.总结 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期. 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围. 二.php之sta ...

  2. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  3. python variable_PyTorch中的Variable变量详解

    一.了解Variable 顾名思义,Variable就是 变量 的意思.实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这正好就符合了反向传播,参数更新的属性. 具体来说,在pyt ...

  4. Linux环境变量详解

    Linux环境变量详解 环境变量是操作系统环境设置的变量,适用于整个系统的用户进程. 环境变量分类 按照权限分类 系统级:系统级的环境变量是每个登录到系统的用户都要读取的系统变量 用户级:用户级的环境 ...

  5. python全局变量global线程安全_对python多线程与global变量详解

    今天早上起来写爬虫,基本框架已经搭好,添加多线程爬取功能时,发现出错: 比如在下载文件的url列表中加入200个url,开启50个线程.我的爬虫-竟然将50个url爬取并全部命名为0.html,也就是 ...

  6. php的 静态变量,PHP之static静态变量详解

    在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...

  7. (35)System Verilog类静态变量详解

    (35)System Verilog类静态变量详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类静态变量详解 5)结语 1.2 F ...

  8. ubuntu下环境变量详解 bashrc, profile, environment

    ubuntu下环境变量详解 bashrc, profile, environment 本博客转载自:http://blog.csdn.net/hipkai/article/details/415486 ...

  9. c语言path环境变量,Windows下PATH等环境变量详解(转载)

    在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...

  10. Java简单类、变量详解(概念和分类、声明、命名、初始化)

    1初识JAVA简单类 (1)创建第一个Java程序的具体步骤: 第一步:创建一个工程,在Package Explorer空白区域中右击New->点击Java Project->填写Proj ...

最新文章

  1. 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )
  2. “全面二孩”效应消失,这十大原因导致“生不动”
  3. RedHat Enterprise Linux6.4 使用CentOS yum源
  4. 泛型(模拟list)
  5. 【Java数据结构与算法】第十章 哈希表和二叉树
  6. 深入浅出mybatis之入门使用
  7. ajax url 的是什么格式,什么是从AJAX URL格式来发送POST方法有响应实体
  8. (四)在真实数据上运行AI时尚分类
  9. 【报告分享】全面解码美妆消费者心智-阿里妈妈.pdf(附下载链接)
  10. 潮流短视频必备——PR赛博朋克效果视频转场快速过渡模板
  11. 豆知识( DNS; HTTP入门;网络协议)
  12. Word文档怎么横向排版?这三种方法简单高效专业
  13. vue适配PC端屏幕自适应
  14. 爱丁堡 ANLP-Lecture 1(NLP Structure Morphology, Ambiguity, Part of Speech)
  15. 信贷客户调查中最需关注的十个方面(附经典案例解析)
  16. XCTF re5-packed-movement
  17. html5唤起高德,h5页面唤醒百度高德地图
  18. 学习札记————问题札记
  19. 计算机中push英语是什么意思,push是什么意思_push的翻译_音标_读音_用法_例句_爱词霸在线词典...
  20. 如何提高同行评审的有效性

热门文章

  1. 看看ConcurrentLinkedQueue源码 in Java 9
  2. 开课吧:人工智能技术会如何影响青年就业
  3. 开课吧Java教程什么是类集接口
  4. Mac终端的一些操作命令
  5. 简单的shell命令
  6. Android知识点复习(一)-Android系统架构
  7. 【Spring框架】mvc:default-servlet-handler/的作用
  8. Cocos2D中图片加-hd后缀的说明
  9. linux 多窗口查看多命令的操作结果
  10. jQuery checkbox全选问题