目录
一、ansible中的变量
- 变量命名
只能包含数字,下划线,字母
只能用下划线或字母开头 - 变量级别
全局: 从命令行或配置文件中设定的
paly: 在play和相关结构中设定的
主机: 由清单,事实收集或注册的任务 - 变量优先级设定:
狭窄范围有限与广域范围
1.示例
如下,变量命名有误,运行失败
成功运行
二、变量设定和使用方式
1.在playbook中直接定义变量
使用变量#
tasks:
- name: create user
user:
name: "{{ USER }}"
2.在文件中定义变量
变量westos在westos.yml文件中
设定两个变量文件,msg输出信息
3.使用循环定义
接下来使用循环定义的方式,使用loop和item实现循环执行
1、在playbook中直接定义变量
---
- name: test
hosts: 172.25.254.170
vars:
user:
- ttt
- qqq
tasks:
- name: user
user:
name: "{{ item }}" 代表循环的每一个变量(上面定义的)
state: present
loop: 定义循环
"{{ user }}"
直接定义变量user,测试创建指定用户;
执行playbook过程如下
用户成功建立
2、在playbook中指定变量文件 westos.yml
[lr@ansible ansible]$ cat test1.yml
---
- name: test
hosts: 172.25.254.170
vars_files:
- ./westos.yml 定义文件位置
tasks:
- name: user
user:
name: "{{ item }}" 每次执行一个westos的值
state: absent
loop: 循环定义语句,定义westos的值为多个个
"{{ westos }}"
删除指定用户
nodezz主机查看,用户已被删除
编写yml文件
执行playbook为node主机安装指定服务,开启并设置开机自启
安装成功
4.设定主机变量和清单变量
在定义主机变量和清单变量时使用,清单中直接给出变量,yml文件直接执行清单即可引用清单中的变量
清单:定义了westos组里面的USER变量为test
[westos]
172.25.254.170
[westos:vars]
USER=test 直接给予变量
执行playbook如下:
test用户成功建立
5.目录设定变量
1、针对清单生效
group_vars **清单变量**,目录中的文件名称与主机清单名称一致
host_vars **主机变量**,目录中的文件名称与主机名称一致
建立清单、设定清单变量;
westos 文件名需要和主机清单名一致
虽然user.yml目前没有定义USER的变量,但我们已经新建了特定名称的group_vars文件,系统会自动识别此目录。在文件里设定了执行清单westos里的变量USER;
执行playbook,删除指定用户
2、针对主机生效
可以针对特定的主机设定特定变量
建立特定的host_vars文件,ansible会自动读取。注意目录中的文件名称与主机名称一致;
执行playbook,建立指定的用户linux
用户建立成功
6.用命令覆盖变量
原来的USER的变量值为linux
使用命令覆盖变量值
7.使用数组设定变量
单独建立列表,使用数组设定变量
内容如下
执行playbook
8.注册变量
register :把模块输出注册到指定字符串中
---
- name: test play
hosts: westos
tasks:
- name: shell
shell: echo hello world
register: westos 将输出全部注册给变量westos
- name: show
debug: debug输出模块
msg: "{{westos}}" msg展示返回的变量westos
执行playbook
当需要输出某个具体的参数时:需要具体指定输出变量
shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试;
-e 文件名 :如果文件存在则为真;
由于node主机/mnt目录下不存在hello文件,因此rc=1(返回值)
设定忽略错误
执行playbook成功
继续优化yml文件
9.事实变量
事实变量是ansible在受控主机中自动检测出的变量;
事实变量中还有与主机相关的信息,当需要使用主机相关信息时不需要采集赋值,直接调用即可。
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被称为事实变量。
我们可以使用setup模块获取被管理主机的所有facts信息,可以使用filter来查看指定的信息。setup模块获取的整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最外层的值。我们可以通过以下Ansible Ad-Hoc命令查看facts信息:
查看nodez主机的事实变量
过滤所需变量
也可以使用yml文件查看具体值;
msg:后面是受控机的hostname
facts组件是Ansible用于采集被管理主机设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。当设定为no,在playbook中关闭事实变量收集,则会报错
10.魔法变量
1、hostvars: ansible软件的内部信息
eg:
ansible localhost -m debug -m "var=hostvars"
2、group_names: 当前受管主机所在组
eg:
ansible localhost -m debug -m "var=group_names"
3、groups: 列出清单中所有的组和主机
eg:
ansible localhost -m debug -m "var=groups"
4、inventory_hostname: 包含清单中配置的当前授管主机的名称
eg:
ansible localhost -m debug -m "var=inventory_hostname"
示例如下,查看 ansible软件的内部信息
三、练习
建立两个虚拟主机及设置默认发布测试页
create web vhost
www.westos.com 80 ------ > /var/www/html
linux.westos.com 80 ------> /var/www/virtual/westos.com/linux
数组变量:
playbook
---
- name:
gather_facts: no
vars_files: ./vhost_list.yaml
hosts: westos
tasks:
- name: install web
dnf:
name: httpd
state: latest
- name: create index doc
file:
path: "{{ item.doc }}"
state: directory
loop:
"{{ WEBS }}"
- name: create index file
copy:
content: "{{ item.index }}"
dest: "{{ item.doc }}/index.html"
loop:
"{{ WEBS }}"
- name: clear config
file:
name: /etc/httpd/conf.d/vhost.conf
state: absent
- name: configure vhost
lineinfile:
path: /etc/httpd/conf.d/vhost.conf
create: yes
line: |+
<VirtualHost *:80>
DocumentRoot "{{ item.doc }}"
ServerName "{{ item.webname }}"
</VirtualHost>
loop:
"{{ WEBS }}"
- lineinfile:
path: /etc/httpd/conf.d/vhost.conf
line: |+
<VirtualHost _default_:80>
DocumentRoot /var/www/html
</VirtualHost>
insertbefore: BOF
- name: start service
service:
name: httpd
state: restarted
enabled: yes
- name: configure firewalld
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
执行
[lr@ansible ansible]$ ansible-playbook web.yaml
在node主机可以看到Apache虚拟主机vhosts.conf配置文件
以及虚拟主机对应的默认发布目录和页面
在真机做好本地解析,就可以在网页或者curl测试访问啦~