Ansible 学习总结—— Ansible 变量详解
Posted 科技D人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 学习总结—— Ansible 变量详解相关的知识,希望对你有一定的参考价值。
Ansible 和其他编辑语言一样,可以通过变量来存储值,并在 Ansible 项目的所有文件中使用这些值
变量的命名规则
必须以字母开头;
只能包含字母,数字和下划线;
变量范围
Global:全局变量,在命令行中,通过 -e 参数传递;
Play:在 Playbook 中的 play 里面 通过 vars 或 vars_files 关键字定义的变量
Host:由清单中,主机或主机组中定义的变量
全局变量
编写 playbook,在该 playbook 中,我们为 apt 模块来安装软件包,并为软件包的 name 选项指定一个名为 package 的变量;
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Install Apache
hosts: servera
tasks:
- name: Install package
apt:
name: " package "
state: present
* 在 play 中通过 “ VariableName ”
* 在需要打印出来的字段中引用变量不需要加引号,在其他地方引用变量需要加引号,如,在 name 中引用,因为变量名与花括号之间有空格,name 不能把他们识别成一个整体,所以不加引号会报错;
运行 playbook 时,通过 -e 来指定变量名对应的值;
it@workstation:~/ansible$ ansible-playbook test.yml -e "package=apache2"
BECOME password:
PLAY [Install Apache] ******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Install apache2] *****************************************************************************
ok: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
* 我前面已经执行过安装 Apache2 了,所以这里执行的结果是 ok,而不是 changed;
Play 变量
Play 变量就是在 playbook 中为每个 play 定义的变量,play 变量可以直接定义在 play 中,通过 vars 关键字定义;也可以定义在文件中,然后在 play 中通过 vars_files 关键字导入变量文件;通过 vars 关键字定义变量。创建 playbook,并通过 vars 关键定义一个 user 的变量,对应的值为 Jack。
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
vars:
user: jack
tasks:
- name: Create a user named user
user:
name: " user "
运行 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Create a user named jack] ********************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
从创建用户的 task 名称可以看到,变量 user 被其对应的值所替换;通过文件定义变量,创建变量文件,并在文件中定义一个 user 变量,并指定值为 Jerry。
it@workstation:~/ansible$ vim user.yml
it@workstation:~/ansible$ cat user.yml
---
user: jerry
* 注意变量文件的格式应为 yml 文件格式;编写 playbook,在 play 中通过 vars_files 关键字来导入变量文件
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
vars_files:
- user.yml
tasks:
- name: Create a user named user
user:
name: " user "
主机变量
编辑主机清单,在主机后面添加一个 user 变量,并指定值为 user1;
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb user=user1
[web]
servera
[prod:children]
web
创建 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: serverb
tasks:
- name: Create a user named user
user:
name: " user "
运行 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [serverb]
TASK [Create a user named user1] *******************************************************************
changed: [serverb]
PLAY RECAP *****************************************************************************************
serverb : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量 user 被对应的值,user1 替换了;我们还可以在主机变量目录(host_vars)中定义主机变量文件。更改清单,删除清单中定义的变量
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
[prod:children]
web
在 ansible 目录中创建一个 host_vars 目录,并在这个目录下以主机名创建一个 yml 文件,并在文件中指定 user 变量;
it@workstation:~/ansible$ mkdir host_vars
it@workstation:~/ansible$ vim host_vars/servera.yml
it@workstation:~/ansible$ cat host_vars/servera.yml
---
user: user2
编辑 playbook
t@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
tasks:
- name: Create a user named user
user:
name: " user "
运行 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Create a user named user2] *******************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量 user 被对应的值,user2 替换了;
主机组变量
编辑主机清单文件,通过 [GroupName:vars] 为主机组添加变量
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
serverb
[prod:children]
web
[web:vars]
user=user3
删除之前在 host_vars 目录下创建的变量文件
it@workstation:~/ansible$ rm host_vars/servera.yml
编辑 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: web
tasks:
- name: Create a user named user
user:
name: " user "
运行 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]
TASK [Create a user named user3] *******************************************************************
changed: [servera]
ok: [serverb]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量 user 被对应的值,user3 替换了;同样,你也可以通过组变量文件目录(group_vars)定义主机组变量文件。更改主机清单,删除前面创建的主机变量
t@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
serverb
[prod:children]
web
创建主机组变量目录,并以组名作为文件名,创建一个 yml 格式的变量文件,并在文件中指定 user 变量,值为 user4;
it@workstation:~/ansible$ mkdir group_vars
it@workstation:~/ansible$ vim group_vars/web.yml
it@workstation:~/ansible$ cat group_vars/web.yml
---
user: user4
创建 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: web
tasks:
- name: Create a user named user
user:
name: " user "
运行 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]
TASK [Create a user named user4] *******************************************************************
changed: [serverb]
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量 user 被对应的值,user4替换了;
Ansible Register 相关变量
在 Ansible 中,我们可以通过 register 捕获 task 的输出,并将它保存到一个变量中,方便在以后的任务中调用;编写 playbook,我们通过 whoami 这个 shell 命令去查看当前登录的用户,并将结果赋值给 register 变量 user,然后通过 debug 模块输出 user 变量的信息;
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Check the user
hosts: servera
tasks:
- name: View the logged in user name
shell: whoami
register: user
- debug:
var: user
运行 playbook,在运行 debug 模块时,显示了输出的结果;
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Check the user] ******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [View the logged in user name] ****************************************************************
changed: [servera]
TASK [debug] ***************************************************************************************
ok: [servera] =>
"user":
"changed": true,
"cmd": "whoami",
"delta": "0:00:00.002775",
"end": "2021-01-19 08:53:22.611335",
"failed": false,
"rc": 0,
"start": "2021-01-19 08:53:22.608560",
"stderr": "",
"stderr_lines": [],
"stdout": "root",
"stdout_lines": [
"root"
]
PLAY RECAP *****************************************************************************************
servera : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
change: 表示执行命令的状态,如果命令执行了,则为 true;
cmd: 表示的则是你当前执行的命令;
delta: 表示命令执行所花费的时间
start: 表示命令开始执行的时间
end: 表示命令结束的时间
failed: 表示命令执行的结果,如果为 false 则表示命令执行成功,true 则表示命令执行失败
rc: 表示命令执行的返回码(return code),0 表示执行成功;
stderr:命令输出的标准错误信息
stderr_lines: 按换行符分割输出的内容,在多行输出时,显示的效果比 stderr 更加直观
stdout: 命令的标准输出信息
stdout_lines: 按换行符分割输出的内容,在多行输出时,结果更加直观
我们可以在 playbook 中,很方便地调用这些输出。编写 playbook,在 playbook 中调用 register 变量中的输出,然后调用该变量的输出信息,打印出一条消息:
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Check the user
hosts: servera
tasks:
- name: View the logged in user name
shell: whoami
register: user
- debug:
msg: "Logged in as user user.stdout "
运行 playbook,在运行 debug 模块时,我们看到了输出的消息
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Check the user] ******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [View the logged in user name] ****************************************************************
changed: [servera]
TASK [debug] ***************************************************************************************
ok: [servera] =>
"msg": "Logged in as user root"
PLAY RECAP *****************************************************************************************
servera : ok=3 changed=1 unreachable=0 failed=0 skipped=0 re
以上是关于Ansible 学习总结—— Ansible 变量详解的主要内容,如果未能解决你的问题,请参考以下文章
Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结
Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结
Ansible PlayBook的中清单变量优先级分析及清单变量如何分离总结
Ansible 学习总结—— Ansible 控制提权相关知识总结