ansible使用5-Variables
变量命名
支持数字、字母、下划线
有效:foo_port, foo5
无效:foo-port, foo port, foo.port, 12
playbook定义
- hosts: webservers
vars:
http_port: 80
jinja2模板使用变量
My amp goes to {{ max_amp_value }}
template: src=foo.cfg.j2 dest={{ remote_install_path }}/foo.cfg
Jinja2 Filters
格式化数据
{{ some_variable | to_nice_json }}
{{ some_variable | to_nice_yaml }}
使用条件表达式
tasks:
- shell: /usr/bin/foo
register: result
ignore_errors: True
- debug: msg="it failed"
when: result|failed
# in most cases you'll want a handler, but if you want to do something right now, this is nice
- debug: msg="it changed"
when: result|changed
- debug: msg="it succeeded"
when: result|success
- debug: msg="it was skipped"
when: result|skipped
强制变量定义
{{ variable | mandatory }}
变量默认值
{{ some_variable | default(5) }}
变量省略值
- name: touch files with an optional mode
file: dest={{item.path}} state=touch mode={{item.mode|default(omit)}}
with_items:
- path: /tmp/foo
- path: /tmp/bar
- path: /tmp/baz
mode: "0444"
列表
# 最小值
{{ list1 | min }}
# 最大值
{{ [3, 4, 2] | max }}
# 唯一值
{{ list1 | unique }}
# 并集
{{ list1 | union(list2) }}
# 交集
{{ list1 | intersect(list2) }}
# 补集(存在list1,不存在list2)
{{ list1 | difference(list2) }}
# 对称差集 (不同时存在每个列表)
{{ list1 | symmetric_difference(list2) }}
版本比较
{{ ansible_distribution_version | version_compare('12.04', '>=') }}
# <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
# 版本分析strict=True,默认值false
随机数
{{ ['a','b','c']|random }} => 'c'
{{ 59 |random}} * * * * root /script/from/cron
{{ 100 |random(step=10) }} => 70
{{ 100 |random(1, 10) }} => 31
{{ 100 |random(start=1, step=10) }} => 51
洗牌(shuffle)
{{ ['a','b','c']|shuffle }} => ['c','a','b']
{{ ['a','b','c']|shuffle }} => ['b','c','a']
其他
# 列表转字符串
{{ list | join(" ") }}
# 文件全路径
{{ path | basename }}
# 目录全路径
{{ path | dirname }}
# 用户目录(~)全路径
{{ path | expanduser }}
# link的路径
{{ path | readlink }}
# Base64加解密
{{ encoded | b64decode }}
{{ decoded | b64encode }}
# 文件的sha1sum
{{ filename | sha1 }}
bool
- debug: msg=test
when: some_string_value | bool
正则
vars:
url: "http://example.com/users/foo/resources/bar"
tasks:
- shell: "msg='matched pattern 1'"
when: url | match("http://example.com/users/.*/resources/.*")
- debug: "msg='matched pattern 2'"
when: url | search("/users/.*/resources/.*")
# convert "ansible" to "able"
{{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }}
# convert "foobar" to "bar"
{{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }}
- hosts: app_servers
vars:
app_path: "{{ base_path }}/22"
Facts
'''bash
ansible hostname -m setup
{{ ansible_devices.sda.model }}
{{ ansible_hostname }}
'''
Turning Off Facts
- hosts: whatever
gather_facts: no
本地facts(自定义facts)
# /etc/ansible/facts.d/preferences.fact
[general]
asdf=1
bar=2
# 命令
ansible <hostname> -m setup -a "filter=ansible_local"
# API
"ansible_local": {
"preferences": {
"general": {
"asdf" : "1",
"bar" : "2"
}
}
}
# 引用
{{ ansible_local.preferences.general.asdf }}
# 部署
- hosts: webservers
tasks:
- name: create directory for ansible custom facts
file: state=directory recurse=yes path=/etc/ansible/facts.d
- name: install custom impi fact
copy: src=ipmi.fact dest=/etc/ansible/facts.d
- name: re-read facts after adding custom fact
setup: filter=ansible_local
Fact Caching
{{ hostvars['asdf.example.com']['ansible_os_family'] }}
# /etc/ansible/ansible.cfg
[defaults]
fact_caching = redis
fact_caching_timeout = 86400
# seconds
yum install redis
service redis start
pip install redis
Registered Variables
- hosts: web_servers
tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: True
- shell: /usr/bin/bar
when: foo_result.rc == 5
Accessing Complex Variable Data
{{ ansible_eth0["ipv4"]["address"] }}
{{ ansible_eth0.ipv4.address }}
{{ foo[0] }}
Magic Variables, and How To Access Information About Other Hosts
{{ hostvars['test.example.com']['ansible_distribution'] }}
{% if 'webserver' in group_names %}
# some part of a configuration file that only applies to webservers
{% endif %}
{% for host in groups['app_servers'] %}
# something that applies to all app servers.
{% endfor %}
# example
{% for host in groups['app_servers'] %}
{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}
Variable File Separation
---
- hosts: all
remote_user: root
vars:
favcolor: blue
vars_files:
- /vars/external_vars.yml
tasks:
- name: this is just a placeholder
command: /bin/echo foo
---
# in the above example, this would be vars/external_vars.yml
somevar: somevalue
password: magic
Passing Variables On The Command Line
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
#example
---
- hosts: '{{ hosts }}'
remote_user: '{{ user }}'
tasks:
- ...
ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"
or
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'
or
--extra-vars "@some_file.json"
Variable Precedence: Where Should I Put A Variable?
#组变量默认值在group_vars/all
---
# file: /etc/ansible/group_vars/all
# this is the site wide default
ntp_server: default-time.example.com
# 组变量,覆盖组默认变量
---
# file: /etc/ansible/group_vars/boston
ntp_server: boston-time.example.com
# 主机变量,覆盖组变量
---
# file: /etc/ansible/host_vars/xyz.boston.example.com
ntp_server: override.example.com
role variable precedence
---
# file: roles/x/defaults/main.yml
# if not overridden in inventory or as a parameter, this is the value that will be used
http_port: 80
# 不能覆盖默认值
---
# file: roles/x/vars/main.yml
# this will absolutely be used in this role
http_port: 80
# 使用这种方式覆盖默认值
roles:
- { name: apache, http_port: 8080 }
roles:
- { role: app_user, name: Ian }
- { role: app_user, name: Terry }
- { role: app_user, name: Graham }
- { role: app_user, name: John }
# roles/common/vars/main.yml
roles:
- { role: common_settings }
- { role: something, foo: 12 }
- { role: something_else }
ansible使用5-Variables的更多相关文章
- ansible 配置文件设置
目录 ansible 配置文件设置 一.ansible configuration settings 二.ansible 配置文件查找顺序(从上到下,依次查找) 三.附录ansible配置参数 ans ...
- Ansible@一个高效的配置管理工具--Ansible configure management--翻译(三)
未经书面许可.请勿转载 一张图简单概括 Simple Playbooks Ansible is useful as a command-line tool for making small chang ...
- Ansible--Ansible之Playbook
Ansible之Playbook Playbook介绍 playbook参考文档 Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态 ...
- Ansible Playbook Variables
虽然自动化存在使得更容易使事情重复,但所有的系统可能不完全一样. 在某些系统上,您可能需要设置一些与其他操作略有不同的行为或配置. 此外,一些观察到的远程系统的行为或状态可能需要影响如何配置这些系统. ...
- useful Ansible commands
This article includes some useful Ansible commands. I will try to write blogs by English. You may wa ...
- Ansible学习笔记
一.Ansible简介 Ansible是一种agentless(基于ssh),可实现批量配置.命令执行和控制,基于Python实现的自动化运维工具. 其特性有: ①模块化:通过调用相关模块,完成指定任 ...
- ansible模块debug
示例: # Example that prints the loopback address and gateway for each host - debug: msg="System { ...
- ansible的使用技巧
#查看ansible的帮助 $ ansible -h #ansible 指定不通的模块执行 $ ansible -i /etc/ansible/hosts docker -u root -m c ...
- Ansible之playbook
简介 playbook是一个非常简单的配置管理和多主机部署系统.可作为一个适合部署复杂应用程序的基础.playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式.playbook是 ...
- ansible的playbook组件
playbook的核心元素: tasks: 任务 variables: 变量 templates: 模板 handlers: 处理器 roles: 角色 组织格式:YAML(被称为另外一种标记语言) ...
随机推荐
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_元数据
1.元数据简介 全称:metadata 属性:数据表集合 产地:面向 CLR 的编译器在托管模块中生成 2.元数据内部结构及与托管模块的关系 [概述] 托管模块中包含着元数据,元数据是由一组数据表组成 ...
- hdu Minimum Inversion Number(逆序数的小知识与线段树)
飞! 题解 首先,求逆序数对的思路: 1.得到整个数列后,从前往后扫,统计比a[i]小的,在a[i]后面的有多少个 这样做的话,应该是只有n2的暴力作法,没想到更好的方法 2.统计a[i]前面的,且比 ...
- css雪碧图制作
使用css背景合并工具cssSprite 工具下载链接: http://download.csdn.net/download/wx247919365/8741243 1.选择文件 2.生成雪碧图 3. ...
- A. Free Cash
A. Free Cash time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- args 、kwargs不定参数通过列表、元组、字典传递
*args .**kwargs是不定参数的表达方法,一般用于函数形参.*args .**kwargs 作为传递参数的函数,在使用过程中,可对*args .**kwargs多个输入,但是效率或者比较麻烦 ...
- C# 利用ITextSharp导出PDF文件
最近项目中需要导出PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- GRE新东方推荐学习方法(2010年左右)
单词:新东方新版红宝书(<NEW GRE 词汇精选>),不用<再要你命三个> 填空:新东方绿皮书(扎实的词汇量) 阅读:1 新东方绿皮书:2 <GRE阅读 39+3全攻略 ...
- mysql初期使用全本
mysql mysql前戏 数据库服务器-:运行数据库管理软件 =>pc 数据库管理软件:管理-数据库 => mysql 数据库:用来组织文件/表 => 文件夹 表:用来存放多行内容 ...
- web service, wcf, wcf rest, web api之间的区别
在.NET Framework中,有很多种技术可以创建基于http协议的服务,譬如说web service, wcf,wcf rest和web api等等.网上有很多的文章教我们如何开发.使用这几种技 ...
- 案例50-crm练习dao层的抽取BaseDao
1 抽取BaseDao 2 BaseDao设计思路 3 BaseDao接口书写 package www.test.dao; import java.io.Serializable; import ja ...