Ansible-playbook的变量和引用

本文介绍了Ansible中七种常见的变量定义方法及其引用方式,包括通过Inventory文件、Ansible配置目录下的文件、命令行传参、playbook内部定义等方式,并演示了如何在任务间传递数据。

1、通过Inventory文件定义主机和主机组变量

 Ansible默认的Inventory文件是INI格式。直接开始测试,先看定义的host文件:

[root@zero01 inventory]# cat host_playbook 
192.168.79.129 key=129 
192.168.79.130 key=130
192.168.79.131 key=131
192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
 接下来,编写一个playbook文件验证变量的引用是否正确,内容如下:

[root@zero01 playbook]# cat variable.yaml 
---
- hosts: all
  gather_facts: False
  tasks:
    - name: diplay Host Variable from hostfile
      debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
 运行playbook(不指定绝对路径要在playbook文件下运行),如下所示:

[root@zero01 playbook]# ansible-playbook variable.yaml

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is 129"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is 130"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is 131"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is 132"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0   
 可以看到,每台主机都引用了自己的主机变量key;下面开始测试主机组变量,先注释掉每台主机的变量定义,再给nginx组定义一个主机组变量,变量名为key且值为zero_gg(此处如果要修改变量名,要对应修改playbook),如下所示:
[root@zero01 inventory]# cat host_playbook 
#192.168.79.129 key=129 
#192.168.79.130 key=130
#192.168.79.131 key=131
#192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
key=zero_gg
 运行playbook文件:

[root@zero01 playbook]# ansible-playbook variable.yaml 

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is zero_gg"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0  
 可以看到,主机组变量针对组内所有的主机都生效。注意:如果主机同时定义了主机变量和主机组变量,名字相同时,主机变量生效,主机组变量不生效;名字不同时,都可以调用。


2、通过/etc/ansible/下的文件定义主机和主机组变量

 使用yum安装Ansible默认配置文件是在/etc/ansible/目录下,可在该目录下,创建文件夹host_vars定义主机变量,创建group_vars定义主机组变量(此情况要求yaml文件不再/etc/ansible/的子目录下);如果采用其他的安装方式,在playbook文件当前目录下创建两个目录即可。如下:

[root@zero01 ansible]# tree
.
├── ansible.cfg
├── hosts
├── inventory
│   ├── host
│   └── host_playbook
├── playbook
│   ├── group_vars
│   │   └── nginx
│   ├── host_vars
│   │   ├── 192.168.79.129
│   │   ├── 192.168.79.130
│   │   ├── 192.168.79.131
│   │   └── 192.168.79.132
│   ├── nginx.yaml
│   ├── tasks
│   │   └── main.yaml
│   ├── variable.retry
│   └── variable.yaml
└── roles

[root@zero01 inventory]# cat host
192.168.79.129
192.168.79.130
192.168.79.131
192.168.79.132 
[nginx]
192.168.79.1[29:32]

 分别在group_vars、host_vars下创建主机组变量文件和主机变量文件,内容如下:

[root@zero01 ansible]# cat group_vars/nginx
---
key: zero_gg
[root@zero01 ansible]# head host_vars/*
==> host_vars/192.168.79.129 <==
---
key: 192.168.79.129

==> host_vars/192.168.79.130 <==
---
key: 192.168.79.130

==> host_vars/192.168.79.131 <==
---
key: 192.168.79.131

==> host_vars/192.168.79.132 <==
---
key: 192.168.79.132
 运行playbook文件,结果如下:

[root@zero01 playbook]# ansible-playbook variable.yaml 

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is 192.168.79.129"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is 192.168.79.130"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is 192.168.79.131"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is 192.168.79.132"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0   
 由上可验证,当主机变量和主机组变量同时存在且名字相同时,只有主机变量生效,主机组变量不生效;

 下面验证group_vars/下的nginx组的主机组变量,如下:

[root@zero01 playbook]# rm -rf host_vars/*
[root@zero01 playbook]# ansible-playbook variable.yaml 

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is zero_gg"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0  
3、通过ansible-playbook命令行传入

 通过ansible-playbook命令行传参的方式定义变量,默认传进去的都是全局变量,如下:

[root@zero01 playbook]# ansible-playbook variable.yaml -e "key=ZERO"

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is ZERO"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is ZERO"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is ZERO"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is ZERO"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0  
 这种方式同时支持传入多个变量,还支持指定文件的方式传入变量,变量的文件内容支持两种格式:YAML和JSON

 YAML:

[root@zero01 tmp]# cat var.yaml 
---
key: YAML
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.yaml"

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is YAML"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0  
 JSON:

[root@zero01 tmp]# cat var.json 
{"key": "JSON"}
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.json"

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is JSON"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is JSON"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is JSON"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is JSON"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0  

4、在playbook文件内使用vars

[root@zero01 playbook]# vi variable.yaml 
---
- hosts: all
  gather_facts: False
  vars:
     key: Ansible
  tasks:
    - name: diplay Host Variable from hostfile
      debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
 直接运行,如下:

[root@zero01 playbook]# ansible-playbook variable.yaml

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is Ansible"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is Ansible"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is Ansible"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is Ansible"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0   
 如上,playbook文件中定义的变量对所有主机都有效,可理解为主机组变量。


5、在playbook文件内使用vars_files

[root@zero01 playbook]# cat variable.yaml 
---
- hosts: all
  gather_facts: False
  vars_files:
     - /tmp/var.yaml
  tasks:
    - name: diplay Host Variable from hostfile
      debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
 vars_files默认搜索当前路径,如果文件不在当前目录,需要指出绝对路径。
[root@zero01 playbook]# ansible-playbook variable.yaml 

PLAY [all] *******************************************************************************************************************

TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
    "msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
    "msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
    "msg": "The 192.168.79.132 Value is YAML"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.130             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.131             : ok=1    changed=0    unreachable=0    failed=0   
192.168.79.132             : ok=1    changed=0    unreachable=0    failed=0 

6、使用register内的变量

 Ansible playbook内task之间还可以互相传递数据,比如我们总共有两个tasks,其中第2个task是否执行是需要判断第1个task运行后的结果,这个时候我们就得在task之间传递数据,需要把第1个task执行的结果传递给第2个task。

 Ansible task之间传递数据使用register方式

[root@zero01 playbook]# cat register.yaml 
---
  - hosts: all
    gather_facts: False
    tasks:
       - name: register variable
         shell: hostname
         register: info
       - name: display variable
         debug: msg="The variable is {{ info }}"
 这里把第1个task执行hostname的结果register给info这个变量,然后第2个task把这个结果使用debug模板打印出来,如下:

[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129

PLAY [all] *******************************************************************************************************************

TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]

TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The variable is {'stderr_lines': [], u'changed': True, u'end': u'2017-12-23 17:46:05.777637', 'failed': False, u'stdout': u'zero02', u'cmd': u'hostname', u'rc': 0, u'start': u'2017-12-23 17:46:05.768962', u'stderr': u'', u'delta': u'0:00:00.008675', 'stdout_lines': [u'zero02']}"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=2    changed=1    unreachable=0    failed=0   
info的结果是一段Python字典数据,存储着很多信息,包括执行时间状态变化输出等信息。从字典中,取出想要的值

[root@zero01 playbook]# cat register.yaml 
---
  - hosts: all
    gather_facts: False
    tasks:
       - name: register variable
         shell: hostname
         register: info
       - name: display variable
         debug: msg="The variable is {{ info['stdout'] }}"
 修改register.yaml文件内容,info['stdout']是一个标准的Python语言在字典中取值的用法,执行playbook,如下所示:

[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129

PLAY [all] *******************************************************************************************************************

TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]

TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "The variable is zero02"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=2    changed=1    unreachable=0    failed=0  

7、使用vars_prompt传入

 Ansible支持在运行playbook的时,通过交互式的方式给定义好的参数传入参数值,只需在playbook中定义vars_prompt的变量名和交互式提示内容即可。
 Ansible可以对输入的变量值进行加密处理,比如采用SHA512和MD5算法加密。需要注意:如果要对变量值进行加密,ansible机器上要安装passlib python库

[root@zero01 playbook]# cat prompt.yaml 
---
- hosts: all
  gather_facts: False
  vars_prompt:
      - name: "one"
        prompt: "Please input one value"
        private: no
      - name: "two"
        prompt: "Please input two value"
        default: 'good'
        private: yes
  tasks:
      - name: display one value
        debug: msg="one value is {{ one }}"
      - name: display two value
        debug: msg="two value is {{ two }}"
 one为非私有变量,two为私有变量,private的作用是交互模式下是否显示输入的变量值。

[root@zero01 playbook]# ansible-playbook prompt.yaml -l 192.168.79.129
Please input one value: Ansible
Please input two value [good]: 

PLAY [all] *******************************************************************************************************************

TASK [display one value] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "one value is Ansible"
}

TASK [display two value] *******************************************************************************************************************
ok: [192.168.79.129] => {
    "msg": "two value is zero"
}

PLAY RECAP *******************************************************************************************************************
192.168.79.129             : ok=2    changed=0    unreachable=0    failed=0  
 这里总结了7中常用的定义变量的方式,以及如何去引用。欢迎大家,实践指正,谢谢!



zero_gg:开明睿智,大气谦和...

Ansible 是一个强大的自动化工具,可以用于配置管理、应用部署、任务自动化等场景。Ansible 的 `ansible-playbook` 命令是其核心功能之一,用于执行定义在 YAML 格式文件中的 Playbook。以下是对 `ansible-playbook` 命令的使用方法及示例的详细说明。 ### 执行 Playbook 的基本命令 Playbook 文件通常以 `.yaml` 或 `.yml` 结尾,其中定义了多个任务(tasks)以及目标主机(hosts)等信息。执行 Playbook 的基本命令如下: ```bash ansible-playbook playbook_file.yaml ``` 该命令会按照 Playbook 文件中定义的任务顺序,依次在目标主机上执行操作 [^3]。 ### 检查 Playbook 文件的语法 在执行 Playbook 之前,建议先检查文件的语法是否正确,避免因格式错误导致任务失败: ```bash ansible-playbook playbook_file.yaml --syntax-check ``` 该命令会验证 YAML 文件的格式是否符合规范,确保没有语法错误 [^4]。 ### 列出 Playbook 中的任务 如果需要查看 Playbook 中定义的所有任务,可以使用以下命令: ```bash ansible-playbook playbook_file.yaml --list-tasks ``` 该命令会列出所有任务的名称,帮助用户快速了解 Playbook 的执行内容 。 ### 列出生效的主机 在执行 Playbook 之前,可以查看哪些主机将受到影响: ```bash ansible-playbook playbook_file.yaml --list-hosts ``` 该命令会列出所有将执行任务的主机主机组 [^4]。 ### 从指定任务开始执行 在调试或重新执行 Playbook 时,可能需要从某个特定任务开始执行,而不是从头开始。可以使用 `--start-at-task` 参数实现: ```bash ansible-playbook playbook_file.yaml --start-at-task='Task Name' ``` 该命令会跳过之前的所有任务,直接从指定名称的任务开始执行 [^3]。 ### 传递参数用户认证 在执行 Playbook 时,可能需要提供额外的参数或进行用户认证: - `-k` 或 `--ask-pass`:交互式输入 SSH 密码 - `-K` 或 `--ask-become-pass`:交互式输入 `sudo` 密码 - `-u`:指定远程执行的用户 例如,若目标主机需要密码认证,可以使用以下命令: ```bash ansible-playbook playbook_file.yaml -u username -k ``` 这将提示用户输入 SSH 密码 [^4]。 ### 示例:配置 `/etc/hosts` 文件 以下是一个简单的 Playbook 示例,用于将模板文件 `hosts.j2` 渲染并复制到目标主机的 `/etc/hosts` 文件中: ```yaml - name: Configure hosts file hosts: all_servers remote_user: root tasks: - name: Copy hosts.j2 template to target servers template: src: hosts.j2 dest: /etc/hosts ``` 执行该 Playbook 的命令如下: ```bash ansible-playbook hosts.yaml ``` 该 Playbook 会在 `all_servers` 组中的所有主机上执行任务,将本地的 `hosts.j2` 模板文件渲染后复制到 `/etc/hosts` 路径下 [^5]。 ### 调试 Playbook 在开发或维护 Playbook 时,调试功能可以帮助快速定位问题。Ansible Playbook Debugger 是一个开源工具,允许用户在 Playbook 执行过程中进行交互式调试。通过该工具,可以在任务执行时查看变量值、执行中间步骤等 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值