ansible(3)

ansible变量

为什么用变量

使用变量可以便捷的管理ansible项目中的动态值。

定义变量的方式

  1. 通过命令行进行变量定义
  2. 在play文件中进行定义变量
  3. 通过inventory在主机组或单个主机中设置变量

定义变量的优先级

通过play文件中进行定义变量

在 - host下使用vars关键字进行定义变量

- hosts:webservers
  vars:
    - web_packages: httpd
    - ftp_packages: vsftpd
  tasks:
    - name: install rpm packages
      yum:
        name:
          - "{{web_packages}}"
          - "{{ftp_packages}}"
        state: present
# 上面文件内容主要实现的功能是安装httpd以及vsftpd。 
# 这种方法定义的变量只能作用于当前文件中 
 通过vars_files来进行定义变量

[root@manager ansible_variables]# cat test.yml
web_packages: httpd-tools
ftp_packages: vsftpd


[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 var2.yml
- hosts: webservers
  vars_files: test.yml

  tasks:
    - name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum:
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present
# 使用这种方法定义的变量可以在不同文件中使用,但是需要先准备一个文件来定义变量

通过inventory在主机组或单个主机中设置变量

# 定义方法
[webservers:vars]
filename=webservers_group_filename
# 官方不推荐
# 官方推介做法
2.通过inventory在主机组或单个主机中设置变量

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

[root@manager ansible_variables]# cat group_vars/webservers
web_packages: wget
ftp_packages: tree

[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


[root@manager ansible_variables]# cat group_vars/all
web_packages: nfs-utils
ftp_packages: rsync

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


通过命令行进行变量定义

ansible-playbook 在哪个文件中定义变量 -e "变量名=变量值"

变量调用的优先级

  1. 外置传参 -e
  2. playbook
    vars_files
    vars
  3. host_vars
  4. group_vars/组名
  5. group_vars/all

使用变量实现NFS

[root@manager ansible_variables]# cat group_vars/all
share_dir: /data3

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

    - name: Installed NFS Server
      yum:
        name: nfs-utils

    - name: Configure NFS Server	#配置文件中使用 了share_dir #共享的目录/data3
      template:
        src: ./exports.j2
        dest: /etc/exports
      notify: Restart NFS Server

    - name: Create Share Directory	#创建共享的目录使用share_dir  /data3
      file:
        path: "{{ share_dir }}"
        state: directory
        owner: www
        group: www
        mode: 755

    - name: Started NFS Server
      systemd:
        name: nfs
        state: started
        enabled: yes

  handlers:
    - name: Restart NFS Server
      systemd:
        name: nfs
        state: restarted

- hosts: db
  tasks:
    - name: Client Mount NFS Server
      mount:
        src: 172.16.1.7:{{ share_dir }}
        path: /ansible_mount
        fstype: nfs
        state: mounted

变量注册

用于排查错误,可以使用register关键字可以playbook输出的结果保存到某个变量中,使用debug来查看。

register变量注册,将执行的结果存储至变量中,后期可以通过结果进行判断的操作。
[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.stdout_lines }}"


{{ System_Net }} 能看到变量的所有信息

{{ System_Net.stderr }}	#能捕获到错误,如果没有就是空,如果有错误就会限制在终端窗口

facts变量

什么是facts

用于自动获取被控端主机的状态信息,开启该变量会影响playbook运行的效率,但是关闭又会造成tasks无法使用,因此后续我们需要使用redis缓存来对playbook进行优化。

facts使用场景

  1. 通过变量检查被控端硬件cpu信息,从而生成不同的nginx配置文件
  2. 通过facts变量检查被控端内存状态信息,从而生成不同的memcached配置文件
  3. 通过facts变量检查被控端主机名称信息,从而生成不同的zabbix配置文件
  4. 通过facts变量检查被控端主机ip地址信息,从而生成不同的redis配置文件

facts应用示例

根据ip地址生成不同的redis配置文件

修改控制端redis配置文件中的ip地址为
{{ ansible_eth1.ipv4.address }}
playbook的内容如下:

- 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

根据cpu核心生成不同的nginx配置文件

存放cpu核心数的变量是“
{{ ansible_processor_vcpus }}
实现方法为:

[root@manager ansible_variables]# cat nginx.yml

- hosts: webservers
  tasks:
    - name: Configure  Nginx.conf
      template:
        src: ./nginx.conf.j2
        dest: /tmp/nginx.conf

[root@manager ansible_variables]# cat nginx.conf.j2
worker {{ ansible_processor_vcpus * 2 }};



跟据主机内存生成不同的memcached配置文件

存放主机内存的变量是:
{{ ansible_mentotal_mb }}
要求缓存为内存大小的一半。
可以如下表示:
{{ ansible_mentotal_mb //2 }}
实现方法为:

[root@manager ansible_variables]# yum install memcached -y
[root@manager ansible_variables]# cp /etc/sysconfig/memcached ./memcached.j2
[root@manager ansible_variables]# cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""

[root@manager ansible_variables]# cat memcached.yml
- hosts: webservers
  tasks:
    - name: Installed Memcached Server
      yum:
        name: memcached
        state: present

    - name: Configure Memcached Server
      template:
        src: memcached.j2
        dest: /etc/sysconfig/memcached
      notify: Restart Memcached Server

    - name: Started Memcached Server
      systemd:
        name: memcached
        state: started
        enabled: yes

  handlers:
    - name: Restart Memcached Server
      systemd:
        name: memcached
        state: restarted

根据不同的主机名生成不同的zabbix配置文件

存放主机名称的变量是:
{{ ansible_hostname }}
具体配置方法如下:

https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm


[root@manager ansible_variables]# cat zabbix_agent.yml
- hosts: all
  tasks:
    - name: Installed ZabbixAgent
      yum:
        name: https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm
        state: present

    - name: Configure ZabbixAgent
      template:
        src: ./zabbix_agentd.conf.j2
        dest: /etc/zabbix/zabbix_agentd.conf
      notify: Restart ZabbixAgent

    - name: Started ZabbixAgent
      systemd:
        name: zabbix-agent
        state: started
        enabled: yes

  handlers:
    - name: Restart ZabbixAgent
      systemd:
        name: zabbix-agent
        state: restarted


[root@manager ansible_variables]# grep "^Hostname" zabbix_agentd.conf.j2
Hostname={{ ansible_hostname }}

配置ansible支持redis缓存


1.安装一个redis   172.16.1.51 安装过了,就不要需要安装,直接使用就行了。
2.配置ansible配置文件,让其支持redis缓存:	

[root@manager ansible_variables]# cat ansible.cfg
[defaults]
inventory = ./hosts

gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 172.16.1.7:6379



yum install python-pip
pip install redis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值