Ansible 变量的定义和引用

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_VERSIONMYSQL_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"
        ]
    }
}

这里有价值的几个输出为 failedrcstderrstderr_linesstdoutstdout_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']

Ansible 变量的定义和引用
https://www.linuxstudynotes.com/2025/04/20/ansible/ansible-%e5%8f%98%e9%87%8f%e7%9a%84%e5%ae%9a%e4%b9%89%e5%92%8c%e5%bc%95%e7%94%a8/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇