金鱼哥戏说RHCE认证:管理变量和事实--管理变量

举报
金鱼哥 发表于 2022/09/28 23:58:09 2022/09/28
【摘要】 第四章 管理变量和事实--管理变量

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL、PMP😜
💬格言:努力不一定成功,但要想成功就必须努力🔥

🎈支持我:可点赞👍、可收藏⭐️、可留言📝


前文再续,书接上一回,上一回讲到对Ansible Playbook进行简介,今回介绍Ansible究竟如何定义变量的。就正如shell当中的变量,占据着很重要的地位,如果不理解,首先肯定看不懂别人写的剧本,其次更不能编写对应的剧本。

123


📜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
image-20211206222039409


📜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” # 这样指定会覆盖剧本或者其余地方有定义该名称的变量。
33


📜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

来自官网的说明:

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#defining-variables-in-a-playbook)

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"

所以遇到这样的情景时候,记得写成这样,否则语法检查户报错。
image-20211206185959362


📜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

66


📜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

后续的章节学习中会有更多注册变量的演示,也可自行定义去玩耍进行理解。
image-20211206190949936


📜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 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。