金鱼哥戏说RHCE认证:管理变量和事实--管理变量
🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL、PMP😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
前文再续,书接上一回,上一回讲到对Ansible Playbook进行简介,今回介绍Ansible究竟如何定义变量的。就正如shell当中的变量,占据着很重要的地位,如果不理解,首先肯定看不懂别人写的剧本,其次更不能编写对应的剧本。
📜1. ansible变量简介
ansilbe支持利用变量来存储值,并在ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。
通过变量,可以轻松地在ansible项目中管理给定环境的动态值。例如,变量可能包括下面这些值:
-
要创建的用户
-
要安装的软件包
-
要重新启动的服务
-
要删除的文件
-
要从互联网检索的存档
📜2. 变量命名
变量的命名应该符如下规范:
变量名仅能由字母、数字和下划线组成,且只能以字母开头。
ansible内置的关键字不能作为变量名。
例如:host_port、HOST_PORT、var5是符合命名规范的**,foo-port、 foo port、foo.port 、12**都不符合命名规范。
变量的定义通常是YAML形式,在inventory host文件中也可以使用INI形式。
ansible变量不仅可以支持简单的key=value格式,而且也支持更复杂数据结构,例如字典类型等。
官网地址:https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
📜3. 命令行变量
我们可以在执行playbook的命令行指定变量,需要注意的是,**命令行指定的变量在所有其他变量中优先级是最高的。**也就是说如果命令行指定的变量和其他地方指定的变量有冲突时,那么ansible最终会采用命令行定义的变量。
-e,–extra-vars:此参数表示从命令行传入变量
-e “key=value”:直接传递变量的格式
-e “@vars.yml”:传递变量文件的格式
命令行指定变量示例如下:
ansible-playbook web.yml –extra-vars “version=1.23.45 other_variable=foo” # 这样指定会覆盖剧本或者其余地方有定义该名称的变量。
📜4. 作用于playbook的变量
📑vars语句定义全局变量
我们可以在playbook中使用「vars」语句定义变量,该变量作用于整个play。
例如:
---
# inventory/playbooks/test.yaml
- hosts: node1
vars:
http_port: 80
上面示例中中**「http_port」**是一个作用于整个play的变量,对这个play里的tasks、roles、import、include等等(这些现在不知道没关系,后面会教你如何去装-逼)之下定义的task均生效。
📑引用变量文件
除了将变量写在playbook中,我们也可以将变量放在一个单独的YAML文件中,通过**「vars_files」**语句来导入。
「vars_files」变量只能作用于play全局,不能在某个task中单独被引用。
「vars_files」参数可以使用系统绝对路径或playbook文件的相对路径。
📑用例子辅助理解:
📑vars定义变量与引用(引用方式是两个大括号)
# cat test.yml
---
- hosts: web
vars:
- my_name: abc # 前面的-也可以不加,但习惯加上可统一书写。
- phone: 123456
tasks:
- name: add content
copy:
content: "{{ my_name }}"
dest: /data/a.txt
📑vars_files 定义变量与引用
# cat variables
my_name: abc
http_port: 80
# 案例一
# cat test.yml
---
- hosts: web
vars_files:
- variables
tasks:
- name: add content
copy:
content: "{{ http_port }}"
dest: /data/b.txt
# 案例二
# cat test.yml
---
- hosts: web
vars_files:
- variables
tasks:
- name: add content
template:
src: /root/b.txt
dest: /root/c.txt
# cat b.txt
{{ my_name }}
{{ http_port }}
# cat c.txt
abc
80
"var_files"关键字引入了对应的变量文件,然后使用了文件中定义的变量。当然也可以引用多个变量文件,每个被引入的文件都需要以“-”开头。
“var”关键字和“var_files”关键字可以同时使用,如下:
var:
- conf90: /etc/nginx/conf.d/90.conf
vars_files:
- /testdir/ansible/nginx_vars.yml
来自官网的说明:
YAML syntax requires that if you start a value with {{ foo }} you quote the whole line, since it wants to be sure you aren’t trying to start a YAML dictionary. This is covered on the YAML Syntax documentation.
#This won’t work:
- hosts: app_servers
vars:
app_path: {{ base_path }}/22
#Do it like this and you’ll be fine:
- hosts: app_servers
vars:
app_path: "{{ base_path }}/22"
所以遇到这样的情景时候,记得写成这样,否则语法检查户报错。
📜5. 主机清单定义主机和主机组变量
我们可以在主机清单中定义所需要的主机变量(作用于单主机)和主机组变量(作用于整个主机组)。
📑主机变量:
主机的后边设置key=value的格式
注:inventory_hostname是ansible自带的变量,代表组中的每个主机
- 在配置文件中定义主机变量
# cat /etc/ansible/hosts
[webservers]
servera key=101
serverb key=111
[root@servera ~]# ansible all -m shell -a 'echo "{{ key }}"'
servera | CHANGED | rc=0 >>
101
serverb | CHANGED | rc=0 >>
111
📑主机组变量
- 在配置文件中定义主机组变量
# cat /etc/ansible/hosts
[webservers]
servera
serverb
[webservers:vars]
ansiber_version=2.7
key=nginx
[root@servera ~]# ansible all -m shell -a 'echo "{{ key }}"'
servera | CHANGED | rc=0 >>
nginx
serverb | CHANGED | rc=0 >>
nginx
[root@servera ~]# ansible all -m shell -a 'echo "{{ ansiber_version }}"'
servera | CHANGED | rc=0 >>
2.7
serverb | CHANGED | rc=0 >>
2.7
📜6. 文件定义主机以及主机组变量
除了在主机清单中定义变量外,我们还可以在特定的目录下定义:
主机变量目录:host_vars(注:需要在此目录下为每个主机创建一个文件,在此文件中定义变量)
组变量目录:group_vars(注:需要在此目录下创建一个以主机组名命名的文件,在此文件中定义变量)
注:以上两个目录均不存在,需要自己手动创建;mkdir /etc/ansible/{host_vars,group_vars}
注:当需要为所有主机或者所有主机组创建一样的变量时,在host_vars和group_vars目录下,创建all文件并写入变量即可~
- 在配置文件中定义主机组
# cat /etc/ansible/hosts
[webservers]
servera
serverb
- 在host_vars目录下创建以主机名为名字的文件,并在此文件中配置变量,变量格式为: key: value
# mkdir host_vars
# vim host_vars/servera
# vim host_vars/serverb
# head host_vars/*
==> host_vars/servera <==
key: 101
==> host_vars/serverb <==
key: 111
[root@servera ~]# ansible all -m shell -a 'echo "{{ key }}"'
servera | CHANGED | rc=0 >>
101
serverb | CHANGED | rc=0 >>
111
- 在group_vars目录创建以主机组为名字的文件,并在此文件中配置变量,变量格式为:key: value
# mkdir group_vars
# vim group_vars/webservers
# head group_vars/*
name: nginx
[root@servera ~]# ansible all -m shell -a 'echo "{{ name }}"'
servera | CHANGED | rc=0 >>
nginx
serverb | CHANGED | rc=0 >>
nginx
📜7. 注册变量
这是一个比较特别的变量,不过一定要学会,否则以后很难混江湖。(说白了就是想去装嘛,懂的。)
register方法能够将一个task的执行结果注册为一个变量。书写格式要与模块名称对齐,该变量作用于整个playbook。
通常register变量和when语句联合使用,以达到满足某些条件才运行task的目的。
# cat hosts
localhost
# cat test.yml
---
- hosts: all
gather_facts: no
tasks:
- name: display register vars
shell: hostname
register: info
- name: dispaly info
debug:
msg: "{{info}}"
# ansible-playbook test.yml -i hosts
PLAY [localhost] ************************************************************************
TASK [display register vars] ************************************************************
changed: [localhost]
TASK [dispaly info] *********************************************************************
ok: [localhost] => {
"msg": {
"changed": true,
"cmd": "hostname",
"delta": "0:00:00.007093",
"end": "2020-09-06 01:25:25.393600",
"failed": false,
"rc": 0,
"start": "2020-09-06 01:25:25.386507",
"stderr": "",
"stderr_lines": [],
"stdout": "workstation.lab.example.com",
"stdout_lines": [
"workstation.lab.example.com"
]
}
}
PLAY RECAP ******************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
后续的章节学习中会有更多注册变量的演示,也可自行定义去玩耍进行理解。
📜8. 练习演示
📑查看配置文件和主机清单
[student@servera ~]$ mkdir variables
[student@servera ~]$ cd variables/
[student@servera variables]$ cat ansible.cfg
[defaults]
inventory=inventory
remote_user=student
[privilege_escalation]
become=False
become_method=sudo
become_user=root
become_ask_pass=False
[student@servera variables]$ cat inventory
[webserver]
servera
📑编写所需要的剧本
[student@servera variables]$ cat web.yml
- name: Deploy and start apache httpd service
hosts: webserver
vars:
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
rule: http
tasks:
- name: required packages are installed and up to date
yum:
name:
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
state: latest
- name: The {{ firewall_service }} service is started and enabled
service:
name: "{{ firewall_service }}"
enabled: true
state: started
- name: The {{ web_service }} service is started and enabled
service:
name: "{{ web_service }}"
enabled: true
state: started
- name: web content is in place
copy:
content: "Example web content for vars./n"
dest: /var/www/html/index.html
- name: The firewall port for {{ rule }} is open
firewalld:
service: "{{ rule }}"
permanent: true
immediate: true
state: enabled
- name: Test web server
hosts: localhost
become: no
tasks:
- name: connect to web server
uri:
url: http://servera
return_content: yes
status_code: 200
📑语法检查
[student@servera variables]$ ansible-playbook --syntax-check web.yml
playbook: web.yml
📑执行剧本
[student@workstation variables]$ ansible-playbook web.yml
PLAY [Deploy and start apache httpd service] ********************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [required packages are installed and up to date] ***********************************
changed: [servera]
TASK [The firewalld service is started and enabled] *************************************
ok: [servera]
TASK [The httpd service is started and enabled] *****************************************
ok: [servera]
TASK [web content is in place] **********************************************************
changed: [servera]
TASK [The firewall port for http is open] ***********************************************
ok: [servera]
PLAY [Verify the Apache service] ********************************************************
TASK [Gathering Facts] ******************************************************************
ok: [localhost]
TASK [Ensure the webserver is reachable] ************************************************
ok: [localhost]
PLAY RECAP ******************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
servera : ok=6 changed=2 unreachable=0 failed=0
💡总结
- 变量定义有他的规范,需要谨记。
- 变量的调用有其优先级,需要合理编写;命令行中的调用优先级最高。
- 变量可在主机清单和文件中定义。
- 注册变量会在后续的条件控制里经常出现,需要学会运用。后续还有魔法变量让你去装-逼。
RHCE认证作为基础认证的升级,需要大家在RHCSA的基础上再进行学习,因此,涉及的基础内容需要大家好好进行学习并巩固。有良好的基础才能更上一层楼。
好好加油,可以噶🤪。
以上就是【金鱼哥】对 第四章 管理变量和事实–管理变量 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)