Ansible(变量)

2020-05-17  本文已影响0人  Linux运维

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


一、Ansible variables 变量定义的方式

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

1.在playbook文件中定义
[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
[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
上一篇 下一篇

猜你喜欢

热点阅读