Ansible 变量
- Ansible 的变量区分大小写
- Ansible 的变量不要重名,特别是不要和内置变量冲突
- Ansible 的变量名称可以使用数字、字母和下划线组成,但是只能以字母开头
连接变量
连接变量是 Ansible 的内置变量,这个变量控制 Ansible 对被控主机的连接方式。
可以在主机清单、Playbook 和 ansible -e
处设置变量。
-
ansible_host:指定清单中主机的真实 IP 地址
-
ansible_port:指定清单中主机的端口
-
ansible_user:指定清单中主机的连接用户
-
ansible_become:是否进行特权升级
-
ansible_become_user:通过特权升级到哪个用户
-
ansible_become_password:提升特权时,如果需要密码的话,可以通过该变量指定
-
ansible_sudo_exec:如果 sudo 命令不在默认路径,需要指定 sudo 命令路径
-
ansible_connection:ssh 连接的类型:local, ssh, paramiko,默认是 ssh
-
ansible_ssh_password:ssh 连接时的密码
-
ansible_ssh_private_key_file:秘钥文件路径,如果不想使用 ssh-agent 管理秘钥文件时可以使用此选项
-
ansible_ssh_executable:如果 ssh 指令不在默认路径当中,可以使用该变量来定义其路径
-
ansible_ssh_extra_args:额外的 ssh 参数。
-
ansible_python_interpreter:指定受控主机的 python 的位置
以下是在主机清单中设置变量示例:
[all:vars]
ansible_ssh_user = root
ansible_ssh_password = redhat
ansible_become = true
ansible_become_user = redhat
定义变量
主机清单定义
server1 MYSQL_VERSION=5.7 MYSQL_MASTER=true
[web]
server2
server3
[web:vars]
HTTPD_VERSION=2.4
[all:vars]
SYSTEM_TYPE=RHEL
- 主机变量写在主机后边用空格分隔,如 MYSQL_VERSION 和 MYSQL_MASTER
- 组变量通过组名接
:vars
定义,如 [web:vars] - 所有主机的变量可以通过 [all:vars] 来定义
也可用 yaml 格式定义主机清单
ungrouped:
hosts:
server1:
MYSQL_VERSION: 5.7
MYSQL_MASTER: true
web:
hosts:
server2:
server3:
vars:
HTTPD_VERSION: 2.4
all:
vars:
SYSTEM_TYPE: RHEL
Ansible Playbook 定义并使用变量
通过 vars 关键字设置
---
- name: set sssd
hosts: all
gather_facts: false
vars:
sssd_packages:
- sssd
- sssd-tools
- oddjob
- oddjob-mkhomedir
- libsss_sudo
tasks:
- name: install packages
ansible.builtin.yum:
name: "{{ sssd_packages }}"
sssd_packages 就是定义的变量
通过 set_fact 模块设置
- name: set fact
hosts: localhost
gather_facts: false
tasks:
- name: set fact
ansible.builtin.set_fact:
var1: one
var2:
- two
- three
- name: print vars
ansible.builtin.debug:
msg: "{{ var1 }} and {{ var2 }} "
var1 和 var2 都是通过 set_fact
模块设置的变量,通过 set_fact
设置的变量可以给后续的模块使用。
通过文件设置变量
自定义变量文件
cat vars_file.yml
---
var3: three
var4: four
cat test.yml
- name: set fact
hosts: localhost
gather_facts: false
vars_files:
- ./vars_file.yml
tasks:
- name: print vars
ansible.builtin.debug:
msg: "{{ var3 }} and {{ var4 }} "
将变量写入 vars_file.yml 文件,在 playbook 中通过 vars_files 加载变量文件
设置主机变量
cat host_vars/localhost/vars.yml
---
HTTPD_VERSION: 2.4
cat test.yml
- name: set fact
hosts: localhost
gather_facts: false
tasks:
- name: print vars
ansible.builtin.debug:
msg: "{{ HTTPD_VERSION }}"
在 Ansible 配置文件所在目录创建一个 host_vars 目录,在 host_vars 目录下创建和清单中对应名称或地址的目录,如 ./host_vars/localhost/
(表示设置 localhost
主机的变量),在 ./host_vars/localhost/
下创建任意名称的文件(文件取什么名字都可以,最好以 .yml
或 .yaml
结尾,方便观看),将变量写入文件,如 ./host_vars/localhost/vars.yml
,Ansible 会自动取读取同名目录下的文件,Playbook 可以直接引用变量。
设置主机组变量
cat inventory
[webserver]
server1
server2
cat group_vars/webserver/vars.yml
---
SYSTEM_TYPE: RHEL
cat test.yml
- name: set fact
hosts: webserver
gather_facts: false
tasks:
- name: print vars
ansible.builtin.debug:
msg: "{{ SYSTEM_TYPE }}"
和 host_vars 类似,只不过主机换成了组。
注册变量
cat test.yml
- name: set fact
hosts: webserver
gather_facts: false
tasks:
- name: register
ansible.builtin.command: id
register: register_var
- name: print vars
ansible.builtin.debug:
msg: "{{ register_var }}"
在模块执行成功后可以通过 register
来将输出注册为变量,注册的变量输出如下
ok: [server1] => {
"msg": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"cmd": [
"id"
],
"delta": "0:00:00.004153",
"end": "2024-08-04 23:09:14.460466",
"failed": false,
"msg": "",
"rc": 0,
"start": "2024-08-04 23:09:14.456313",
"stderr": "",
"stderr_lines": [],
"stdout": "uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023",
"stdout_lines": [
"uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023"
]
}
}
这里有价值的几个输出为 failed
、rc
、stderr
、stderr_lines
、stdout
和 stdout_lines
,这几个输出可用于判断执行是否成功和后续模块对这次执行结果内容的引用。
通过 Ansible Ad-Hoc 设置变量
ansible localhost -e SYSTEM_TYPE=RHEL -m debug -a 'msg="{{ SYSTEM_TYPE }}"'
使用 -e
选项设置变量,优先级最高。
Ansible Playbook 引用变量
通过 {{}} 引用
---
- name: set sssd
hosts: all
gather_facts: false
vars:
sssd_packages:
- sssd
- sssd-tools
- oddjob
- oddjob-mkhomedir
- libsss_sudo
tasks:
- name: install packages
ansible.builtin.yum:
name: "{{ sssd_packages }}"
"{{ sssd_packages }}"
就是变量引用的方式,如果是多个变量写法如下 "{{ var1 }} {{ var2 }}"
playbook 在使用变量的时候需要注意双引号的使用,如果某个段落的开头就是调用变量,即以
{{
开头,那么这个段落就需要使用双引号引起来,但如果开始是字符串,那么可以不使用双引号。--- - name: vars example hosts: all vars: var1: one var2: two tasks: - name: debug1 ansible.builtin.debug: msg: vars is {{ var1 }} and {{ var2 }} - name: debug2 ansible.builtin.debug: msg: "{{ var1 }} and {{ var2 }}"
template 模块也可以使用变量,使用方法和上边一样。
通过 [] 引用
[]
引用和 {}
的区别就是 []
内的值会被当成变量处理,举个例子:
---
- name: test
hosts: localhost
vars:
netcard: ens18
tasks:
- name: loop list
debug:
msg: "{{ ansible_facts[netcard].ipv4.address }}"
上边的 "{{ ansible_facts[netcard].ipv4.address }}"
使用了 []
,netcard
也会被当成变量处理,实际要打印的变量为 ansible_facts.ens18.ipv4.address
。
有的地方在引用变量是会使用
['']
,这个因为带有''
,所以里边的值不会当成变量处理,比如:ansible_facts['ens18']ipv4.address
就是ansible_facts.ens18.ipv4.address
。注意使用
[]
时,左边是没有.
的,举个例子:ansible_facts[netcard].ipv4['address']
。