变量优先级
- 在命令中定义的变量(-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 通过参数传入变量