变量的定义:
- 变量名应该由字母、数字下划数组成
- 变量名必须以字母开头
- ansible内置关键字不能作为变量名
一、在Inventory中定义变量
1、 定义主机变量(在主机清单里定义)
1.1 内置主机变量
所谓内置变量其实就是ansible.cfg配置文件中的选项,在其前加上ansible_
即成为内置变量。当然内置变拥有比ansible.cfg中选项更高的优先级,而且针对不同的主机,可以定义不同的值。
# 一般连接 ansible_ssh_host #用于指定被管理的主机的真实IP ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22 ansible_ssh_user #ssh连接时默认使用的用户名 # 特定ssh连接 ansible_connection #SSH连接的类型:local, ssh, paramiko,在ansible 1.2 之前默认是paramiko,后来智能选择,优先使用基于ControlPersist的ssh(如果支持的话) ansible_ssh_pass #ssh连接时的密码 ansible_ssh_private_key_file #秘钥文件路径,如果不想使用ssh-agent管理秘钥文件时可以使用此选项 ansible_ssh_executable #如果ssh指令不在默认路径当中,可以使用该变量来定义其路径 # 特权升级 ansible_become #相当于ansible_sudo或者ansible_su,允许强制特权升级 ansible_become_user #通过特权升级到的用户,相当于ansible_sudo_user或者ansible_su_user ansible_become_pass # 提升特权时,如果需要密码的话,可以通过该变量指定,相当于ansible_sudo_pass或者ansible_su_pass ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径 # 远程主机环境参数 ansible_shell_executable # 设置目标机上使用的shell,默认为/bin/sh ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径 ansible_*_interpreter #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言
实例:
[test] 192.168.1.1 ansible_ssh_user=root ansible_ssh_pass='P@ssw0rd' 192.168.1.2 ansible_ssh_user=breeze ansible_ssh_pass='123456' 192.168.1.3 ansible_ssh_user=bernie ansible_ssh_port=3055 ansible_ssh_pass='456789'
1.2 定义主机组变量
变量也可以通过组名,应用到组内的所有成员:
[wuhan] web1 web2 [suizhou] web4 web3 [hubei:children] wuhan suizhou [hubei:vars] ntp_server=192.168.1.10 zabbix_server=192.168.1.10
二、在Playbook中定义变量
2.1 变量的定义方式
2.1.1 通过vars关键字定义
- name: use vars define invrionmemnt hosts: test user: ansible vars: http_port: 80 server_name: localhost conf_file: /etc/nginx/conf/default.conf
2.1.2 通过vars_files关键字引入变量文件
- hosts: all remote_user: root vars: favcolor: blue vars_files: - vars/external_vars.yml - vars/user_vars.yml # vars/user_vars.yml示例: users: bjones: first_name: Bob last_name: Jones home_dirs: /users/bjones acook: first_name: Anne last_name: Cook home_dirs: /users/acook
2.1.3 在playbook中通过host_vars和group_vars目录定义变量
下面这是一个项目的playbook目录结构。这个项目中,包含一个ansible.cfg文件,一个inventory文件,一个playbook.yml文件,一个group_vars
目录和一个host_vars
目录:
# tree /etc/ansible/playbooks/project /etc/ansible/playbooks/project ├── ansible.cfg ├── group_vars │ ├── datacenter1 │ ├── datacenter2 │ └── datacenters ├── host_vars │ ├── demo1.example.com │ ├── demo2.example.com │ ├── demo3.example.com │ └── demo4.example.com ├── inventory └── playbook.yml
其中inventory文件的示例如下:
[datacenter1] demo1.example.com demo2.example.com [datacenter2] demo3.example.com demo4.example.com [datacenters:children] datacenter1 datacenter2
可以看到group_vars目录中,定义了三个文件,分别以inventory文件中的三个主机组命名,所以这三个文件中定义的就分别是这三个组可以使用的变量。
此种自定义变量比较常见,inventory.ini主机清单中主机组的[datacenter1]对应group_vars下的datacenter1.yml文件
在host_vars目录中,定义了三个文件,分别以inventory文件中的四个主机命名,所以这四个文件中定义的就分别是这四个主机可以使用的变量。
# cat demo1.example.com package: httpd # cat demo2.example.com package: apache # cat demo3.example.com package: mariadb-server # cat demo4.example.com package: mysql-server
假如主机组定义的变量与主机冲突,主机变量优先级最高
2.1.4 注册变量
在有些时候,可能需要将某一条任务执行的结果保存下来,以便在接下的任务中调用或者做些判断。可以通过register关键字来实现将某一任务结果保存为一个变量。
- name: register variables hosts: test tasks: - name: capture output of whoami command command: whoami register: login
注册变量的应用场景:
- 在一台远端的服务器获取一个目录下的一列表的文件,然后下载这些文件
- 在handler执行之前,发现前面一个task发生了changed,然后执行一个指定的task
- 获取远端服务器的ssh key的内容,构建出known_hosts文件
2.1.5 设置变量set_fact
--- - hosts: 192.168.40.132 remote_user: root tasks: - set_fact: testvar: "2022-1-9" - debug: msg: "{{testvar}}"
2.1.6 通过命令行设置变量
--- - hosts: '{{ hosts }}' remote_user: '{{ user }}' tasks: - ... ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck" 或者 --extra-vars '{"hosts":"vipers","user":"starbuck"}'
三、变量优先级
ansible中变量的优先级
- -e (--extra-vars 选项指定的变量)最高
- inventory 主机清单中定义的变量(ansible_ssh_user等)
- play剧本中vars、vars_files定义的变量
- 系统的facts变量
- 角色定义的默认变量 最低
从上到下优先级逐渐降低,高优先级会覆盖掉低优先级的变量
变量的优先级
变量的优先级指的是优先级越高的会覆盖优先级低的,下边的优先级由低到高进行排列:
- role defaults
- inventory vars
- inventory group_vars
- inventory host_vars
- playbook group_vars
- playbook host_vars
- host facts
- play vars
- play vars_prompt
- play vars_files
- registered vars
- set_facts
- role and include vars
- block vars (only for tasks in block)
- task vars (only for the task)
- extra vars (always win precedence)
https://www.cnblogs.com/mauricewei/p/10054300.html 很详细