美文网首页
Ansible(变量)

Ansible(变量)

作者: Linux运维 | 来源:发表于2020-05-17 22:30 被阅读0次

1.Ansible variables 变量定义的方式
2.各种定义变量方式的优先级
3.变量注册
4.facts 变量
5.facts 优化


一、Ansible variables 变量定义的方式

以一个固定的字符串去表示一个不固定的值

1.在playbook文件中定义
  • 通过vars 的方式
[root@manager ansible_variables]# cat var1.yml 
- hosts: webservers
  vars:           #定义变量关键字
    - web_packages: httpd
    - ftp_packages: vsftpd
  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum :
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present
  • 通过vars_files 的方式
[root@manager ansible_variables]# cat var1.yml 
- hosts: webservers
  vars_files: ./test.yml      #指向定义变量的文件,可以指定多个

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum :
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

#创建文件,并定义变量
[root@manager ansible_variables]# cat test.yml 
web_packages: httpd
ftp_packages: vsftpd

2.在定义主机清单的文件中定义变量(了解)

[root@manager ansible_variables]# cat hosts 
[webservers]
172.16.1.7
172.16.1.8
[webservers:vars]      #只能由webservers主机组,来使用变量
web_packages: httpd
ftp_packages: vsftpd

3.通过inventory在主机组或单个主机中定义变量(推荐)

首先需要在ansible配置的目录下,创建 host_vars 和 group_vars 两个目录

root@manager ansible_variables]# mkdir host_vars
[root@manager ansible_variables]# mkdir group_vars

#创建与主机组名称相同的文件,在其中定义变量,只有该主机组可以调用其变量,而 host_vars/172.16.1.7单个主机,这样就可以了
[root@manager ansible_variables]# cat group_vars/webservers
web_packages: wget
ftp_packages: tree

#编写playbook文件,直接应用变量
[root@manager ansible_variables]# cat var4.yml
- hosts: webservers
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

小结: 如果在group_vars目录下创建一个名称为 all 的文件,在其中定义变量,则所有的主机都可以使用定义的变量

4.通过命令行进行变量定义

[root@manager ansible_variables]# cat var6.yml
- hosts: webservers
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
        state: present

[root@manager ansible_variables]# ansible-playbook var6.yml -e "web_packages=httpd"

二、各种定义变量方式的优先级

优先级由高向下排列
①-e 外置传参,命令行
②vars_files
③vars
④host_vars
⑤group_vars/webservers
⑥group_vars/all

三、变量注册

register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排查故障。

[root@manager ansible_variables]# cat var9.yml
- hosts: webservers
  tasks:
    - name: Get Network Status
      shell: netstat -lntp
      register: System_Net
          #将shell命令的执行输出结果,存储至System_Net 变量中

    - name: Print Variables
      debug:
        msg: "{{ System_Net }}"
            #debug模块打印变量所有信息,变量后面可以加东西,
            #例如加 "{{ System_Net.rc }}" ,可以获取想要看到的的信息

四、facts变量

自动采集,“被控端主机”自身的状态信息(例如主机名、IP地址、CPU数量等等)

#可以查找到需要用的facts变量
[root@manager ansible_variables]# ansible webserver -m setup
setup    获取状态信息

案例:根据IP地址生成不同的Redis配置

[root@manager ansible_variables]# cat redis.yml
- hosts: webservers
  tasks:

    - name: Installed Redis Server
      yum:
        name: redis
        state: present

    - name: Configure Redis Server
      template:
        src: ./redis.conf.j2
        dest: /etc/redis.conf
      notify: Restart Redis Server

    - name: Started Redis Server
      systemd:
        name: redis
        state: started
        enabled: yes

  handlers:
    - name: Restart Redis Server
      systemd:
        name: redis
        state: restarted

#在需要拷贝的配置文件进行修改
[root@manager ansible_variables]# cat redis.conf.j2
...
bind 127.0.0.1 {{ ansible_eth1.ipv4.address }}
...

五、facts优化

facts变量开启会影响playbook运行的效率, 但是关闭又会造成无法提取被控端的状态。
为解决这一问题需要使用缓存,缓存facts变量,redis的方法

#python需要安装redis服务
[root@manager ansible_variables]# yum install python-pip -y
[root@manager ansible_variables]# pip install redis

#在ansible配置文件ansible.cfg中修改
[root@manager ansible_variables]# cat ansible.cfg
[defaults]
inventory = ./hosts
#开启redis缓存
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 172.16.1.7:6379

相关文章

  • ansible-playbook 01 变量

    ansible 环境变量优先级 ansible 变量优先级 命令行指定变量 > yaml文件中的变量> 主机清单中...

  • 自定义ansible模块

    准备工作 # 创建ansible模块目录 mkdir /tmp/ansible #声明全局变量,设置ansible...

  • Ansible查找ansible.cfg文件的位置及顺序

    1、ANSIBLE_CONFIG环境变量所指定的文件 2、./ansible.cfg(当前目录下的ansible....

  • Ansible变量学习

    ansible变量的分类 资源清单中定义 /etc/ansible/group_vars/webservers定义...

  • ansible 模板中遍历字典

    需求: 从ansible_facts.ansible_devices变量中查找符合条件的磁盘 数据: templa...

  • Ansible-5 ansible变量

    变量命名规则 变量的名字由字母、下划线和数字组成,以字母开头。 保留关键字不能作为变量名称 变量类型 全局变量 E...

  • ansible failed_when的使用

    在正常使用了ansible剧本中的变量后,突然遇到需要在变量不符合的情况下,中断ansible的剧本。这时候就用到...

  • Ansible魔法变量

    1. 魔法变量 2. Ansible默认会提供一些内置的变量以实现一些特定的功能,我们称之为魔法变量。下面列举一些...

  • 四、Ansible 变量

    我们在PlayBook一节中,将PlayBook类比成了Linux中的shell。那么它作为一门Ansible特殊...

  • 03 Ansible 变量

    本文链接: https://www.jianshu.com/p/b348e7e5358a作者:闫立行 一、 Ans...

网友评论

      本文标题:Ansible(变量)

      本文链接:https://www.haomeiwen.com/subject/mhtmohtx.html