1. ansible-playbook 变量定义与引用
简单的playbook
playbook 是ansible的核心组件,使用的是YAML语法.
下面请看简单的playbook代码
[root@LeoDevops playb]# cat nginx.yaml
- hosts: all
tasks:
- name: Install Nginx Package
apt: name=nginx state=present
- name: Copy Nginx.conf
template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root mode=0644
notify:
- Restart Nginx Service
handlers:
- name: Restart Nginx Service
service: name=nginx state=restarted
- host表示为所有的主机(all)
- tasks是任务集,我们在这个playbook里面定义了三个task
- name表示为每个task的名字,name的下一行是action,表示这个task要完成什么样的动作。
- template 表示模块复制
- notify 是触发handler,表示当配置文件有改动后,就触发handler动作
- handler在这里是重启nginx
- service name表示服务名,state表示要达到什么状态
几个重要语法
在编写playbook的时候,我们需要了解这几个重要的关键词:
- pre_tasks: 设置playbook运行之前的tasks
- post_tasks: 设置playbook运行之后的tasks
playbook变量与引用
我们在Inventory里面定义好变量,比如:
- 我们在hosts里面定义好变量
[root@LeoDevops playb]# grep -vE "(^$|^#)" /etc/ansible/hosts
192.168.93.132 key=132
192.168.93.137 key=137
[nginx]
192.168.93.132
192.168.93.137
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
- 写好palybook
[root@LeoDevops playb]# cat check_variable.yml
- hosts: all
gather_facts: False
tasks:
- name: Display Host Variable From Hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
- 执行playbook
[root@LeoDevops playb]# ansible-playbook check_variable.yml
PLAY [all] ************************************************************************************************************************************************************************************
TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
"msg": "The 192.168.93.132 Value is 132"
}
ok: [192.168.93.137] => {
"msg": "The 192.168.93.137 Value is 137"
}
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132 : ok=1 changed=0 unreachable=0 failed=0
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0
- 另一种方式,直接在playbook定义变量
[root@LeoDevops playb]# cat p_vars.yaml
- hosts: all
gather_facts: False #设置为false,那么下面的debug模块会生效
vars: # 先申明vars这个关键字
key: "Ansible" #这种方式定义,key: value的形式
tasks:
- name: display host variables from hostfile
debug: msg="The {{ inventory_hostname }} value is {{ key }}"
- 或者在playbook里面引用有变量的文件
[root@LeoDevops playb]# cat p_vars.yaml
- hosts: all
gather_facts: False
vars_files:
- var.json
tasks:
- name: display host variables from hostfile
debug: msg="The {{ inventory_hostname }} value is {{ key }}"
[root@LeoDevops playb]# cat var.json
{"key":"json"}
另一种变量引用,定义全局变量针对主机组
- 在hosts的nginx里面定义一个变量key,不在单独对每个主机定义key
grep -vE "(^$|^#)" /etc/ansible/hosts
[nginx]
192.168.93.132
192.168.93.137
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
key=nginx
- playbook保持不变
- 执行playbook
[root@LeoDevops playb]# ansible-playbook check_variable.yml
PLAY [all] ************************************************************************************************************************************************************************************
TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
"msg": "The 192.168.93.132 Value is nginx"
}
ok: [192.168.93.137] => {
"msg": "The 192.168.93.137 Value is nginx"
}
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132 : ok=1 changed=0 unreachable=0 failed=0
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0
通过命令行传输
- 通过-e参数能给将变量传入进去
[root@LeoDevops playb]# ansible-playbook check_variable.yml -e "key=hehe"
PLAY [all] ************************************************************************************************************************************************************************************
TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
"msg": "The 192.168.93.132 Value is hehe"
}
ok: [192.168.93.137] => {
"msg": "The 192.168.93.137 Value is hehe"
}
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132 : ok=1 changed=0 unreachable=0 failed=0
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0
- -e指定文件的方式传入变量
[root@LeoDevops playb]# cat var.json
{"key":"json"}
[root@LeoDevops playb]# ansible-playbook check_variable.yml -e "@var.json"
PLAY [all] ************************************************************************************************************************************************************************************
TASK [Display Host Variable From Hostfile] ****************************************************************************************************************************************************
ok: [192.168.93.132] => {
"msg": "The 192.168.93.132 Value is json"
}
ok: [192.168.93.137] => {
"msg": "The 192.168.93.137 Value is json"
}
PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.132 : ok=1 changed=0 unreachable=0 failed=0
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0
register内的变量
ansible playbook内的task之间还可以互相传递数据,比如我们总共有两个tasks,其中第二个task是否执行是需要判断第1个task运行后的结果,这个时候我们就得在task之间传递数据,需要把第一个task执行的结果传递给第二个task,下面看看简单的register的方式
[root@LeoDevops playb]# cat p_register.yaml
- hosts: u12
tasks:
- name: register variable
shell: date
register: info
- name: display variable
debug: msg="the variable is {{ info['stdout'] }}"
使用vars_prompt传入
ansible 还支持在运行playbook的时候通过交互式的方式给定义好的参数传入变量值,只需要在playbook中定义vars_prompt 的变量名和交互式提示内容即可。当然ansible还可以对传入的变量值进行加密处理。加密处理依赖于passlib python库。请看简单的 vars_prompt的例子
[root@LeoDevops playb]# cat p_prompt.yaml
- hosts: all
gather_facts: False
vars_prompt:
- name: "one"
prompt: "please input your value"
private: no
- name: "two"
prompt: "please input two value"
default: 'good' # 默认显示一个值
private: yes #置为yes的话,那么就是看不见自己输入的什么了
tasks:
- name: display one value
debug: msg="one value is {{ one }}"
- name: display two value
debug: msg="two value is {{ two }}"
执行效果如下:
[root@LeoDevops playb]# ansible-playbook p_prompt.yaml
please input your value: nihao
please input two value [good]:
1. ansible-playbook 变量定义与引用的更多相关文章
- ansible playbook 变量
变量优先级 在命令中定义的变量(-e参数指定的) 在inventory中定义的变量(ansible_ssh_user等) 其他变量(role中.play中) 系统通过father_facts定义的变量 ...
- Ansible Playbook 变量与 register 详解
ansible 定义变量方式与[多层]变量引用,以及 register 详解 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录 ...
- ansible 变量定义和引用
cat /etc/ansible/hosts [nodes]10.2.1.232 key=23210.2.1.43 key=43 cat debug.yaml ---- name: test how ...
- C++---类成员变量定义为引用
摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...
- Ansible系列(六):各种变量定义方式和变量引用
本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...
- Ansible系列(五):各种变量定义方式和变量引用
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible facts facts组件是用来收集被管理节点信息的 ...
- Ansible Playbook概览
Ansible playbook 执行需要三步路执行: 1.编写playbook 2.定义主机清单文件 3.设置运行环境,写入配置文件 1.编写playbook Playbook使用YAML语法格式进 ...
- Ansible Playbook 使用变量
如何在 Playbook 中定义并使用变量: vars: - user: "test" # 定义变量 tasks: - name: create user user: name=& ...
- ansible变量定义
一./etc/ansible/hosts [webServers] 192.168.2.200 http_port=8009 [web]web1web2 [db]db1db2 [app:childre ...
随机推荐
- bzoj 4128 矩阵求逆
/************************************************************** Problem: 4128 User: idy002 Language: ...
- js常用事件
为了便于使读者更好地运用js事件,就把常用事件大致分为以下几种: a. 表单元素事件,在表单元素中生效 onfocus ------获取焦点 onblur -------失去焦点 onsubmit ...
- java泛型-自定义泛型方法与类型推断总结
下面是自定义泛型方法的练习: package com.mari.generic; import java.util.ArrayList; import java.util.Collection; im ...
- java 集合框架 Java集合&List的实现
原文: https://blog.csdn.net/u012658346/article/details/50917068 一.java集合类图如下所示: 上述类图中,实线边框的是实现类,比如Arra ...
- C# ConcurrentDictionary实现
ConcurrentDictionary的源码看了很多遍,今天抽点时间整理一下,它的实现比Dictionary要复杂很多,至于线程安全我觉得比较简单,用的是lock的思想.首先我们来看看它的源码. p ...
- Android APK 打包过程 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Kubernetes 编排系统
1.1 Kubernetes简介 1.1.1 什么是Kubernetes Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用于自动部署.扩展和管理 ...
- WPF如何为程序添加splashScreen(初始屏幕)
一.考虑到大部分的splashscreen其实都只是一个图片,所以最简单的做法是,先导入一张图片,然后设置它的生成操作为“splash screen” 二.通过程序设置SplashScreen pub ...
- 最简单的配置Centos中JAVA的环境变量的方法
一.用途 做云开发,经常用到配置java环境变量,但是每次都写太麻烦了,所以写本文,方便以后复制粘贴. 二.安装Java 1.搜索Java包:yum search java 2.安装Java包:yum ...
- android highcharts 柱状图例子
android提供achartengine api 只能做简单的,如果是复杂的图表,个人的想法结合highcharts来完成:减小工作量,官方提供的例子也非常丰富. 通过android webview ...