Ansible管理变量和Facts

Posted 向阳-Y.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible管理变量和Facts相关的知识,希望对你有一定的参考价值。

变量的定义和引用

Ansible支持变量功能,能将value(值)存储到变量中,这样就能在
Ansible项目中重复使用了。这样就可以简化项目的创建和维护,减少错误
率。
变量提供了一种方便的方法来管理ansible项目中给定环境的动态值。 变
量可以是要创建的用户,要安装的包,要启动的服务,要删除的文件,要从互联
网下载的文件等等

直接调用变量

创建一个setup.sh,定义内容如下

输入source setup.sh即可执行(或者,chmod +x setup.sh后使用./setup.sh执行

下图为111.yml,playbook脚本也可以进行定义变量,使用vars:即可,引用时使用"{{ }}"(即一对引号两对大括号 )


使用ansible-playbook 111.yml执行即可
下图表示成功!

调用其他文件所定义的变量

可以通过vars_files调用其他文件所定义的变量
变量文件var1.yml定义如下

aaa: Hello!welcome to this catalog!
package: tree

变量文件var2.yml定义如下

bbb: hello,this is bbb!
fw: firewalld

varplaybook.yml定义如下

---
- name: tasks1
  hosts: all
  vars_files:
            - /home/student/ansible/var1.yml
            - /home/student/ansible/var2.yml
  tasks:
          - name: test_var1.yml
            debug:
                    msg: "{{aaa}}"
          - name: test_var2.yml
            debug:
                    msg: "{{bbb}}"



- name: tasks2
  hosts: all
  vars_files:
          - /home/student/ansible/var1.yml
          - /home/student/ansible/var2.yml
  tasks:
          - name: install tree
            yum:
                    name: "{{package}}"
                    state: present

          - name: stop firewalld
            service:
                    name: "{{fw}}"
                    state: stopped

成功执行:

group变量和host变量

inventory文件内容如下:

[redhat_group]               #定义一个分组为redhat_group
redhat user=aoa              #为其定义变量user=aoa
redhat_s user=bob            #为其定义变量user=bob


[other_group]                #定义一个other_group
redhat_sc                    


[other_group:vars]           #other_group的变量为user=coc
user=coc

编写一个useradd.yml内容如下:

---
- name: create user
  hosts: all
  tasks:
          - name: add user
            user:
                    name: "{{user}}"
                    state: present

执行ansible-playbook useradd.yml则可以为redhat、redhat_s、redhat_sc分别创建aoa、bob、coc用户(因为ansible本身就会去调用inventory文件,所以只需要将变量写在inventory中即可成功调用

将变量定义在host_vars和group_vars目录中

host_vars目录用于保存主机变量文件,文件名以主机名称命名
group_vars目录用于保存组变量文件,文件名以主机组命名

inventory文件中定义如下

[a]
redhat
redhat_s

[b]
redhat_sc

ansible/group_vars/a文件中定义如下

web: httpd

ansible/group_vars/b文件中定义如下

service: firewalld

ansible/host_vars/redhat文件中定义如下

package: tree

ansible/grou_vars/redhat_s文件中定义如下

web: httpd

ansible/test.yml文件定义如下:

---
- name: 111
  hosts: b
  tasks:
          - name: install "{{web}}"
            yum:
                       name: "{{web}}"
                       state: present
		  - name: stop "{{service}}"
		    service:
		    		   name: "{{service}}"
		    		   state: stopped
- name: 222
  hosts: redhat
  tasks:
          - name: install "{{package}}"
            yum:
            		   name: "{{package}}"
            		   state: present

运行ansible-playbook test.yml测试即可

内置变量

ansible中有一些内置变量,这些变量无需被定义,可以直接拿来使用

常见的内置变量:
ansible_version:
hostvars:
inventory_dir:
inventory_hostname:
groups:
group_name:

注册变量

debug模块
debug是一个调试模块,用于打印输出信息,常用参数有:
msg:自定义输出信息
var:将任务执行的结果注册为变量传递给debug, debug将结果输出出来
register模块
register用于将任务的执行结果注册为变量,通常和debug模块一起使用
debug和register模块使用示例
比较简单,看代码理解:

---
- name: test
  hosts: all
  tasks:
          - name: 使用shell模块输出
            shell:
                  echo "hello world this is a test text!"
            register: hello_result
          - debug:
                  var: hello_result
		  - debug:
		  		  var: hello_result.stdout(表示子层)

子层来自输出结果,如图所示

管理Facts

ansible facts是受管主机上通过ansible自动发现的一系列变量。
ansible facts包含了受管主机的详细信息,如主机名,ip地址,系统版本,磁盘分区信息,CPU信息等。这些信息可以在playbook中直接使用

setup模块

在执行playbook时候,ansible会自动执行第一个task 运行setup模块,用
于收集facts信息。setup模块的作用就是收集受管主机的各种信息,也可以通
ad­hoc方式来运行setup模块。

ansible all -m setup >111.txt

可以在playbook中设置零时关闭facts

gather_facts: no #在yml文件中添加

永久关闭方法:
在ansible.cfg中添加如下配置:

[defaults]
gathering = explicit

使用debug模块输出指定的facts信息

可以先使用ansible all -m setup >111.txt命令将信息输出到111.txt再vim 111.txt查找内置变量(注意不要将facts关闭了,否则将会报错)

---
- name: debug
  hosts: all
  tasks:
          - debug:
                  msg: "ip地址: {{ansible_default_ipv4.address}}"


          - debug:
                  msg: "主机名: {{ansible_hostname}}"


          - debug:
                  msg: "域名: {{ansible_fqdn}}"

常用的facts变量(可以通过setup查询)

ansible_facts[‘fqdn’] 受管主机的FQDN名称
ansible_facts.hostname 受管主机的短格式主机名
ansible_facts.default_ipv4.address 默认IPV4地址
ansible_facts[‘interfaces’] 网络接口
ansible_facts[‘kernel’] 内核版本
ansible_facts.bios_version BIOS版本
ansible_facts[‘distribution’] 系统发行厂商
ansible_facts[‘distribution_version’] 系统发行版本
ansible_facts[‘architecture’]系统架构平台
ansible_facts[‘memtotal_mb’] 系统内存大小(以MB为单位)
ansible_facts[‘swaptotal_mb’] 系统交换分区大小
ansible_facts[‘selinux’][‘mode’] SeLinux状态
ansible_facts[‘devices’][‘sda’][‘size’] 磁盘sda的大小

自定义facts变量

创建文件/ansible/myfacts.fact,文件中定义如下(可以根据需求更改,此处仅做演示):

[genere]
status: enabled
echo: "hello"
package: httpd

创建文件testfact.yml,文件中定义如下:
代码含义是将刚刚创建的myfacts.fact文件copy到root目录的/etc/ansible/

---
- name: facts
  hosts: all
  vars:
          - remote_dir: /etc/ansible/facts.d
          - facts_file: /home/student/ansible/myfacts.fact
  tasks:
          - name: directory
            file:
                    state: directory
                    recurse: yes
                    path: "{{remote_dir}}"
          - name: new facts
            copy:
                    src: "{{facts_file}}"
                    dest: "{{remote_dir}}"

ansible facts是受管主机上通过ansible自动发现的一系列变量,所以在刚刚一系列交互中,setup自动搜集到了myfacts.fact信息,此时需要重新使用ansible all -m setup >111.txt命令生成新的文件,文件中就会包含myfacts.fact的信息
使用/myfacts搜索即可查看到:下次使用时直接调用"{{ansible_local.myfacts}}"即可!

以上是关于Ansible管理变量和Facts的主要内容,如果未能解决你的问题,请参考以下文章

ansible常用的定义变量方式和变量注册facts缓存和template的使用

ansible--变量

ansible优化

ansible模块介绍之ios_facts

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查