Ansible(4)—— Playbook语法之变量的类型

本实验是基于前篇《Ansible(3)—— Playbook语法的使用》实验环境下进行的,其中普通用户devops已经创建好,授权、免密都配置好了。在编辑好playbook.yml下进行的
上一实验的博客链接:https://mp.csdn.net/console/editor/html/104803816

目录

一、变量的简述

  • 变量来源
  • Playbook中变量使用

二、变量的引用

(一)、inventory定义变量

  • 步骤一:编辑hosts文件
  • 步骤二:编辑 playbook.yml文件在文件中使用变量来代替定值
  • 步骤三:测试

(二)、在playbook.yml 文件中直接定义变量

  • 1、编辑playbook.yml 文件
  • 2、测试:

(三)、查看主机信息及对应的变量名

1、通过变量的形式改变httpd服务的发布信息 

  • 步骤一:查看变量信息
  • 步骤二:编辑playbook.yml文件
  • 步骤三:测试

2、编写playbook,展示hosts主机信息

  • 步骤一:查看相关参数的配置
  • 步骤二:编辑hostinfo.j2文件
  • 步骤三: 编辑playbook.yml 文件
  • 步骤四:测试

(四)、组变量的用法

  • 步骤一:  对hosts中的文件的主机进行分组
  • 步骤二:编辑playbook.yml 文件
  • 步骤三:修改httpd配置文件中的端口
  • 步骤四:编译
  • 步骤五:测试

(六)、在include文件中定义变量 loop

     1、在playbook.yml文件中定义变量创建一个用户

  •    步骤一:编辑playbook.yml文件
  •    步骤二:测试

   2、通过调用文件来创建用户

  •   步骤一:编辑:vars/userlist.yml
  •   步骤二:编辑playbook.yml文件
  •   步骤三:测试

(七)、 在命令行中定义变量

  • 步骤一:直接输入对应playbook文件对应模块变量
  • 步骤二:测试:

(八)、魔术变量

  • 步骤一: 创建魔术变量文件
  • 步骤二: 创建配置host的play模块
  • 步骤三: 测试 :

正文 :

一、变量的简述

  • 变量来源
  • Playbook中变量使用

在介绍playbook变量与引用的时候我们先来了解下Ansible的变量来源。

实验环境如下:
172.25.6.1: ansiblecontrol 部署ansible的server环境 负责下发指令给另外两台节点
172.25.6.2: 远端主机(1)
172.25.6.3: 远端主机 (2)


变量来源

  • 1.inventory file中定义的变量
  • 2.playbook中定义的变量
  • 3.include文件和角色中定义的变量

1、inventory定义变量

[webserver]

server2 http_ip=172.25.6.2

2、在模块文件中应用变量

## vim http.conf.j2
Listen {{http_ip}}:{{httpd_port}}

Playbook中变量使用

  • 变量名:仅能由字母、数字和下划线组成,且只能以字母开头
  • 普通变量:主机组中主机单独定义,优先级高于公共变量
  • 公共(组)变量:针对主机组中所有主机定义统一变量
  • 可以通过命令行指定变量,优先级最高
  • 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用"{{ variable_name }}"才生效

 

二、变量的引用

(一)、inventory定义变量

  • 步骤一:编辑hosts文件
  • 步骤二:编辑 playbook.yml文件在文件中使用变量来代替定值
  • 步骤三:测试

(二)、在playbook.yml 文件中直接定义变量

  • 1、编辑playbook.yml 文件
  • 2、测试:

(三)、查看主机信息及对应的变量名

1、通过变量的形式改变httpd服务的发布信息 

  • 步骤一:查看变量信息
  • 步骤二:编辑playbook.yml文件
  • 步骤三:测试

2、编写playbook,展示hosts主机信息

  • 步骤一:查看相关参数的配置
  • 步骤二:编辑hostinfo.j2文件
  • 步骤三: 编辑playbook.yml 文件
  • 步骤四:测试

(四)、组变量的用法

  • 步骤一:  对hosts中的文件的主机进行分组
  • 步骤二:编辑playbook.yml 文件
  • 步骤三:修改httpd配置文件中的端口
  • 步骤四:编译
  • 步骤五:测试

(六)、在include文件中定义变量 loop

     1、在playbook.yml文件中定义变量创建一个用户

  •    步骤一:编辑playbook.yml文件
  •    步骤二:测试

   2、通过调用文件来创建用户

  •   步骤一:编辑:vars/userlist.yml
  •   步骤二:编辑playbook.yml文件
  •   步骤三:测试

(七)、 在命令行中定义变量

  • 步骤一:直接输入对应playbook文件对应模块变量
  • 步骤二:测试:

(八)、魔术变量

  • 步骤一: 创建魔术变量文件
  • 步骤二: 创建配置host的play模块
  • 步骤三: 测试 :

实验环境

虚拟机名称                        ip                      版本                    角色
server1 172.25.6.1   7.5 ansible
server2 172.25.6.2   7.5 远程主机hosts
server3 172.25.6.3   7.5 远程主机hosts

(一)、inventory定义变量

  • 步骤一:编辑hosts文件
  • 步骤二:编辑 playbook.yml文件在文件中使用变量来代替定值
  • 步骤三:测试

步骤一:

编辑hosts文件(上一篇博客已经编辑了相关的内容)

[ansible@server1 ~]$ vim hosts
[test]
server2 web_package=httpd              ##添加变量 web_package 对应的取值为httpd

[prod]
server3]
[ansible@server1 ~]$apache

步骤二:编辑 playbook.yml文件在文件中使用变量来代替定值

[ansible@server1 ~]$ vim playbook.yml

apache
---
- hosts: test
  tasks:
    - name: install apache                 ##安装apache服务
      yum:
        name: "{{  web_package }}"                        ##使用变量代替原来名称
        state: present                     ##运行的状态

    - name: config apache                  ##修改服务端口号模块

...


注意:  
  - name: install {{  web_package }}                ##是名称测不需要加双引号
      yum:
        name: "{{  web_package }}"                        ##使用变量代替原来名称要加双引号

步骤三:

测试

1.1、编译文件

ansible@server1 ~]$ ansible-playbook playbook.yml



 编译成功说明playbook.yml文件已经读取了hosts中的变量信息

正文 :

(二)、在playbook.yml 文件中直接定义变量

  • 1、编辑playbook.yml 文件
  • 2、测试:

1、编辑playbook.yml 文件

(定义的变量文件用##################注解)

---
- hosts: test
  vars:
    web_package: httpd                            ###################### 定义变量的名称 web_package 变量名表示安装包的名称 ###########################
    web_service: httpd                            ###################### 定义变量的名称 web_service 变量名表示服务的名称 ############################
  tasks:
    - name: install {{  web_package }}              ##################### 是名称测不需要加双引号 ###########################
      yum:
        name: "{{  web_package }}"                        ########################引用变量 使用变量代替原来名称要加双引号##########################

  • 1、编辑playbook.yml 文件
  • 2、测试:

        state: present                     ##运行的状态


      ignore_errors: True                 ##返回值如果步为0,就会报错.tasks停止


    - name: config apache                  ##修改服务端口号模块
      copy:
        src: httpd.conf                      ##将当前目录下的httpd.conf文件复制到/etc/httpd/conf/httpd.conf
        dest:  /etc/httpd/conf/httpd.conf
        mode: 644                            ##给定目录的权限为644  


      notify: restart apache
    - name: start apache                     ##开启服务

  • 1、编辑playbook.yml 文件
  • 2、测试:playbook.yml

      service:
        name: "{{ web_service }}"                       ################################引用变量 ####################################
        state: started                     ##要进行操作的动作
        enabled: yes                       ##开启自启的状态
    - name: create index.html                ##创建httpd服务默认的分布目录
      copy:
        content: "www.westos.org"            ##复制此内容到默认的分布目录下
        dest: /var/www/html/index.html       ##httpd服务的默认发布目录

    - name: start firewalld                       ##开启防火墙规则
      service:
        name: firewalld                           ##开启服务的名称
        state: started                            ##动作playbook.yml
        enabled: yes                               ##开启自启动
    - name: custom firewalld                      ##设置防火墙的规则
      firewalld:
        service: http                             ##设置规则的名称
        permanent: yes                            ##永久允许http 访问防火墙
        immediate: yes                            ##立即生效
        state: enabled                            ##开机自启

  handlers:
    - name: restart apache
      service:
        name: "{{ web_service }}"                  ###########################引用变量########################################
        state: restarted      


- hosts: localhost
  become: no                                      ##不改变当前环境变量         
  tasks:      
    - name: test apache                           ##服务器的名称
      uri:
        url: http://server2/index.html  
        return_content: yes                       ##返回内容
  tags: test                                      ##添加标签

2、测试:

2.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml

编译没有报错说明:ansible执行yml文件时,默认会读取yml文件及hosts文件中的变量。但是yml文件中定义的变量优先级高于hosts文件,只有当yml文件中未找到变量时,才会去读取hosts文件。


(三)、查看主机信息及对应的变量名

1、通过变量的形式改变httpd服务的发布信息 

  • 步骤一:查看变量信息
  • 步骤二:编辑playbook.yml文件
  • 步骤三:测试

2、编写playbook,展示hosts主机信息

  • 步骤一:查看相关参数的配置
  • 步骤二:编辑hostinfo.j2文件
  • 步骤三: 编辑playbook.yml 文件
  • 步骤四:测试

system 保留变量facts

key=value格式:通过key=value格式来查找变量

1、通过变量的形式改变httpd服务的发布信息 

  • 步骤一:查看变量信息
  • 步骤二:编辑playbook.yml文件
  • 步骤三:测试

步骤一:查看变量信息

1、查看server系统中的变量信息

[ansible@server1 ~]$ ansible server2 -m setup                ##查看server2主机信息

[ansible@server1 ~]$ ansible server2 -m setup | less        ##查看db组内主机信息


从系统中取对应的变量值

步骤二:编辑playbook.yml文件


---
- hosts: test
  gather_facts: yes                                                          ##从系统中取值时需要添加的变量

...

 - name: create index.html                                              ##创建httpd服务默认的分布目录
      copy:

        content: "{{ ansible_facts['hostname'] }}"               ##从系统 取提取hostname变量对应的值

        dest: /var/www/html/index.html                              ##httpd服务的默认发布目录

步骤三:测试

1.1、编译:

[ansible@server1 ~]$ ansible-playbook playbook.yml          ##编译

1.2、访问server2主机

[ansible@server1 ~]$ curl server2                                           ##访问server2主机
server2

2、编写playbook,展示hosts主机信息

  • 步骤一:查看相关参数的配置
  • 步骤二:编辑hostinfo.j2文件
  • 步骤三: 编辑playbook.yml 文件
  • 步骤四:测试


步骤一:查看相关参数的配置
以查看根分区为例

[ansible@server1 ~]$ ansible server2 -m setup | less

  • 输入:/devices  到设备中查看磁盘分区的命令
  • 查看 / 分区
  • 查看磁盘分区
  • 往下拉找到根分区 :
  • 其他参数的提取同上

步骤二:编辑hostinfo.j2文件
将提取的变量写入文件中

[ansible@server1 ~]$ vim hostinfo.j2                                   ##编辑hostinfo.j2 文件


主机名:    {{  ansible_facts['hostname']  }}
主机ip:    {{  ansible_facts['eth0']['ipv4']['address']  }}
主机网关:  {{  ansible_facts['default_ipv4']['gateway'] }}
主机dns:  {{  ansible_facts['dns']['nameservers']  }}
系统内核:  {{  ansible_facts['kernel']  }}
系统根分区的大小:  {{  ansible_facts['devices']['sda']['partitions']['sda1']['size']}}
系统磁盘空间:  {{  ansible_facts['devices']['dm-0']['size']}}
系统空闲内存:  {{  ansible_facts['memfree_mb']  }} MB
系统版本:  "{{  ansible_facts['distribution']  }}" "{{  ansible_facts['distribution_version']  }}"


步骤三: 编辑playbook.yml 文件

[ansible@server1 ~]$ vim playbook.yml

...

- hosts: all                                           ##读取hosts文件值中所有的主机

  tasks:

    - name: create hostinfo                 ##play的名称              

      template:

        src: hostinfo.j2                          ##读取hostinfo.j2文件中的变量信息

        dest: /tmp/hostinfo                   ##将获取到的变量信息存在被检测主机的/tmp/hostinfo

  tags: info                                        ##添加标签


...

步骤四:测试

1.1、编译


[ansible@server1 ~]$ ansible-playbook playbook.yml -t info

1.2、在server2上查看生成的主机信息


在server2上:
[root@server2 ~]# cat /tmp/hostinfo

在server3上:
[root@server3 ~]# cat /tmp/hostinfo


(四)、组变量的用法

  • 步骤一:  对hosts中的文件的主机进行分组
  • 步骤二:编辑playbook.yml 文件
  • 步骤三:修改httpd配置文件中的端口
  • 步骤四:编译
  • 步骤五:测试

设置index.html文件中监听的是本机ip的80端口信息

步骤一:  对hosts中的文件的主机进行分组

(一)、inventory定义变量

1.1、编辑hosts文件(上一篇博客已经编辑了相关的内容)

[ansible@server1 ~]$ vim hosts
[test]
server2 web_package=httpd              ##添加变量 web_package 对应的取值为httpd

[prod]
server3]
[ansible@server1 ~]$

[ansible@server1 ~]$ vim hosts
[test]
server2

[prod]
server3

[webservers:children]
test
prod

[webservers:vars]
http_port=80


步骤二:
编辑playbook.yml 文件


---
- hosts: webservers
  gather_facts: yes
  vars:
    web_package: httpd                            ## web_package 变量名表示安装包的名称
    web_service: httpd                            ## web_service 变量名表示服务的名称
  tasks:
    - name: install {{  web_package }}                ##是名称测不需要加双引号
      yum:
        name: "{{  web_package }}"                        ##使用变量代替原来名称要加双引号
        state: present                     ##运行的状态
      ignore_errors: True             ##返回值如果步为0,就会报错.tasks停止
    - name: config apache                  ##修改服务端口号模块
      template:
        src: httpd.conf.j2                    ############### ##将当前目录下的httpd.conf.j2文件中的变量信息复制到/etc/httpd/conf/httpd
        dest:  /etc/httpd/conf/httpd.conf
        mode: 644                            ##给定目录的权限为644  
      notify: restart apache
    - name: start apache                     ##开启服务
      service:
        name: "{{ web_service }}"                       ##开启服务的名称
        state: started                     ##要进行操作的动作
        enabled: yes                       ##开启自启的状态
    - name: create index.html                ##创建httpd服务默认的分布目录
      copy:
        content: "{{ ansible_facts['hostname'] }}"            ##复制此内容到默认的分布目录下
        dest: /var/www/html/index.html       ##httpd服务的默认发布目录
    - name: start firewalld                       ##开启防火墙规则
      service:
        name: firewalld                           ##开启服务的名称
        state: started                            ##动作
        enabled: yes                               ##开启自启动
    - name: custom firewalld                      ##设置防火墙的规则
      firewalld:步骤三:修改httpd配置文件中的端口
        service: http                             ##设置规则的名称
        permanent: yes                            ##永久允许http 访问防火墙
        immediate: yes                            ##立即生效
        state: enabled                            ##开机自启
  handlers:
    - name: restart apache
      service:
        name: "{{ web_service }}"             
        state: restarted      
  tags: apache

  • 将目录下的名称改成和文件中定义的一样

[ansible@server1 ~]$ mv httpd.conf httpd.conf.j2              ##修改配置文件的名称

步骤三:

修改httpd配置文件中的端口

[ansible@server1 ~]$ vim httpd.conf.j2


[ansible@server1 ~]$ vim httpd.conf.j2
Listen {{  ansible_facts[ "eth0"]["ipv4"]["address"]  }}:{{ httpd_port }}          ##设置监听端口的变量信息

步骤 四:编译

编译:

[ansible@server1 ~]$ ansible-playbook playbook.yml -t apache

步骤五:

测试:
在server2上:

在server3上:

(五)、注册变量

  • 1、在文件中注册变量
  •       步骤一:  编辑playbook.yml文件 ,注册一个新的变量值
  •       步骤二:测试
  • 2、自定义变量的输出内容
  •       步骤一:编辑playbook.yml文件
  •       步骤二:测试

官网信息:https://docs.ansible.com/ansible/latest/user_guide/playbooks_varibles.html

注册一个新的变量值

1、在文件中定义变量的输出内容

步骤一:

编辑playbook.yml文件 ,注册一个新的变量值
 

...

- hosts: localhost
  gather_facts: no
  become: no                                      ##不改变当前环境变量         
  tasks:
    - name: test apache                           ##服务器的名称
      uri:
        url: http://server2/index.html
        return_content: yes                       ##返回内容

####################################注册新的变量值###################################
      register: result                  ##注册新的变量
    - debug:                            ##输出变量信息
        var: result
  tags: test                                       ##添加标签

###################################################################################

...

步骤二:测试
编译 :

[ansible@server1 ~]$ ansible-playbook playbook.yml -t test


方法二:
减少输出的内容,输出指定的内容

步骤一:

编辑playbook.yml文件

    register: result
    - debug:
        var: result.content        ##指定输出content的内容

步骤二:

测试:

(六)、在include文件中定义变量 loop

1、在playbook.yml文件中定义变量创建一个用户

  •  步骤一:编辑playbook.yml文件
  • 步骤二:测试

2、通过调用文件来创建用户

  • 步骤一:编辑:vars/userlist.yml
  • 步骤二:编辑playbook.yml文件
  • 步骤三:测试

1、在playbook.yml文件中定义变量创建一个用户

步骤一:

编辑playbook.yml文件

[ansible@server1 ~]$ vim playbook.yml

...

- hosts: test
  vars:                                                                                            ##定义变量
      user: user1
      passwd: westos
  tasks:
    - name: create users
      user:
        name: "{{ user }}"                                                                  ##应用引用变量
        password: "{{ passwd|password_hash('sha512') }}"
  tags: user


...

步骤二

测试:

1.1、编译:

[ansible@server1 ~]$ ansible-playbook playbook.yml -t user


1.2、在server2上:

[root@server2 ~]# cat /etc/shadow


2、通过调用文件来创建用户

步骤一:

编辑:vars/userlist.yml

[ansible@server1 ~]$ vim vars/userlist.yml

userlist:
  - user: user1
    passwd: westos
  - user: user2
    passwd: redhat
  - user: user3
    passwd: redhat

输入相关用户建立的信息

步骤二:

编辑playbook.yml文件

- hosts: test
  vars_files:
   - vars/userlist.yml                                                         ##指定读取的变量文件路径
  tasks:
    - name: create users
      user:
        name: "{{ item.user }}"
        password: "{{ item.passwd|password_hash('sha512') }}"
      loop: "{{ userlist }}"
  tags: user

步骤三:

测试

  • 在servrer2上

[root@server2 ~]# cat /etc/shadow

(七)、 在命令行中定义变量

  • 步骤一:直接输入对应playbook文件对应模块变量
  • 步骤二:测试:

例子:使用变量改变httpd服务端口改为8080

步骤一:

直接输入对应playbook文件对应模块变量

[ansible@server1 ~]$ ansible-playbook playbook.yml -t  apache -e "http_port=8080"         ##改变 playbook.yml文件中 apache 所对应的变量值为http_port=8080

(apache对应的模块详件(二)中的文件内容)

步骤二:
测试:
1.1、在server2上查看端口是否改变

[root@server2 ~]# netstat -anltp       ##查看端口信息 

1.2、在server2上输入

[ansible@server2 ~]$ vim /etc/httpd/conf/httpd.conf

(八)、魔术变量

  • 步骤一: 创建魔术变量文件
  • 步骤二: 创建配置host的play模块
  • 步骤三: 测试 :


例:利用魔术变量配置主机hosts文件

步骤一:

创建魔术变量文件

[ansible@server1 ~]$ vim test.j2

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for host in groups['webservers'] %}                                                   ##循环webservers组下边存在的主机名称
{{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}         ## ip    主机名称
{% endfor %}

步骤二:

创建配置host的play模块

[ansible@server1 ~]$ vim playbook.yml

...


- hosts: all
  tasks:
    - name: create hosts
      template:
        src: test.j2              ##指定读取的文件
        dest: /tmp/host           ##将读取的文件存放到此目录下
  tags: hosts

...

步骤三:
测试 :
1.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml  -t  hosts

1.2、在server2上:

[root@server2 ~]# cat /tmp/host


1.3、在server3上:

(在server2、server3上修改hosts成功!!!)

发布了93 篇原创文章 · 获赞 1 · 访问量 1914

猜你喜欢

转载自blog.csdn.net/dghfttgv/article/details/104808636