ansible 变量

Posted FRESHMANS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible 变量相关的知识,希望对你有一定的参考价值。

变量优先级

  • 在命令中定义的变量(-e参数指定的)
  • 在inventory中定义的变量(ansible_ssh_user等)
  • 其他变量(role中、play中)
  • 系统通过father_facts定义的变量

 

playbook中引入变量尽量使用vars_files方式

尽少量的在inventory中使用变量

尽量避免在命令行中使用-e选项来定义变量

 

ansible-hoc

在执行ansible命令时,ansible默认会从/etc/ansible/host_vars/etc/ansible/group_vars目录读取变量定义,如果这两个目录不存在,可手动创建,并且可以创建与hosts文件中定义的组名同名或host名的文件来定义变量

例:给hosts文件内test组主机定义变量

cat /etc/ansible/group_vars/test    #同host_vars变量

---
foo: foox
baz: bax

cat /etc/ansible/host_vars/host1      #此处为host1文件名,ansible-playbook执行时变量只会作用于host1主机,并且会覆盖playbook和role中所有的同名变量
---
user: user

 

如果想从一台主机获取另一台主机的变量信息,可通过hostvars获取

//获取host1主机user变量信息

{{ hostvars[\'host1\'][\'user\'] }}


ansible 常用内置变量

groups        #包含所有hosts文件里主机组的一个列表

group_names    #包含当前主机所在的所有主机组名的一个列表

inventory_hostname    #通过Hosts文件定义主机的主机名

inventory_hostname_short    #变量inventory_hostname的第一部分,如www.baidu.com  这个变量的值为www

play_hosts                #将执行当前任务的所有主机

 

ansible-playbook

在playbook文件内通过vars字段定义变量

 

在playbook文件内使用var_files 引用变量

 

 

使用register内的变量

使用注册器来接受shell命令的返回结果,结果中包含标准输出(stdout)和错误输出(stderr),通常会包含4中类型结果

changed        #任务是否对远程主机造成变更
delta:           #任务运行所用的时间
stdout:            #正常的输出信息
stderr:            #错误信息

 

示例①

 - name: 获取正在运行的app列表
    command: forever list
    register: forever_list      #将结果传给forever_list
  
  - name: 启动node.js
    command: "forever start {{ node_apps_location }}/app/app.js"
    when: "forever_list.stdout.find(\'{{ node_apps_location  }}/app/app.js\') == -1" 

 

示例②

 

 

Facts信息

通过setup获取目标主机的内置变量(cpu ip 磁盘 内存、操作系统等信息)

ansible group -m setup 引用的时候以“.”作为上下级目录的取值符号

 

示例:python 列表取值方式

ansible_eth0.ipv4.address
ansible_eth0[\'ipv4\'][\'address\']

 

执行playbook时跳过gather_facts

---

- hosts: db
  gather_facts: no

 

配置本地Facts变量

可以将需要定义的变量写到一个以.fact结尾的文件中。放到/etc/ansible/facts.d目录,ansible在执行任务的时候会自动到这个文件夹下读取变量信息

/etc/ansible/facts/facts.d/settings.fact

[users]
admin=test,test1
normal=tim

//获取变量
ansible hostname -m setup -a "filter=ansible_local"

//ansible-playbook中应用
- name: 获取本地facts
setup: filter=ansible_local

 

加密敏感数据

api_key.yml

---
my_key: "eqrwEQWREREWQrqeadsfaewerweQweeqwrdfsewqrqewEQWqewr"


加密:

ansible=valut encrypt api_key.yml

按提示输入密码

 

ansible-playbook 通过参数传入变量

 

以上是关于ansible 变量的主要内容,如果未能解决你的问题,请参考以下文章

ansible

1. ansible-playbook 变量定义与引用

尝试在ansible playbook中使用变量文件中的变量

ansible常用的定义变量方式和变量注册facts缓存和template的使用

ansible笔记(14):变量(一)

如何创建片段以重复变量编号中的代码行