本实验是基于前篇《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成功!!!)