3.Ansible varialbes实战

varialbes

1.什么是变量?

以一个固定的字符串,表示一个不固定的值 version: 1.12

2.定义变量?

1.在playbook中定义变量?

>1.vars 关键字

[root@manager project1]# cat f2.yml 
- hosts: webservers
  vars:
    - file_name: playbook_vars

  tasks:
    - name: Create New File
      file:
        path: /tmp/{{ file_name }}
        state: touch

>2.vars_file 属于一种共享的方式

在这里插入图片描述

1.提前准备变量
[root@manager project1]# cat vars_file.yml 
web_packages: httpd
ftp_packages: vsftpd

2.编写剧本
[root@manager project1]# cat f2.yml 
- hosts: webservers
  vars:
    - file_name: playbook_vars

#调用共享vars_file文件,只不过刚好文件名叫vars_file
  vars_files: ./vars_file.yml      //提前创建好的

  tasks:
    - name: Create New File
      file:
        path: /tmp/{{ file_name }}
        state: touch

    - name: Installed Packages {{ web_packages }}
      yum:
        name: "{{ web_packages }}"      //web_packages: httpd 等于安装httpd
        state: present

2.在inventory主机清单中定义变量

>1.清单文件中直接定义 hosts文件定义

[webservers]
172.16.1.7
172.16.1.8 
[webservers:vars]
file_name=hostsfile_group_vars

> 2.创建hosts_vars group_vars 目录

[root@manager project1]# mkdir hosts_vars	#单个主机
[root@manager project1]# mkdir group_vars	#主机组

>>>1.单个主机定义和使用方式 (host_vars能分别对不同的主机定义变量)
[root@manager project1]# cat host_vars/172.16.1.7 
host_vars_name: 172.16.1.7

[root@manager project1]# cat host_vars/172.16.1.8 
host_vars_name: 172.16.1.8

[root@manager project1]# cat f4.yml 
- hosts: webservers

  tasks:
    - name: Create New File
      file:
        path: /opt/{{ host_vars_name }}
        state: touch

>>>2.针对主机组定义的方式 
给指定的webserver组设定变量.其他组主机无法使用该变量

[root@manager project1]# cat group_vars/webservers 
group_host_vars: webservers        //设定group_host_vars的值为webservers

[root@manager project1]# cat f5.yml 
- hosts: webservers
  tasks:
    - name: Create New File {{ group_host_vars }}
      file:
        path:  /opt/{{ group_host_vars }}       //调用变量
        state: touch

>>>3.针对主机组定义的方式  (给所有的主机和主机组设定变量)
[root@manager project1]# cat group_vars/all 
group_host_vars: all

[root@manager project1]# cat f5.yml 
- hosts: webservers
  tasks:
    - name: Create New File {{ group_host_vars }}
      file:
        path:  /opt/{{ group_host_vars }}
        state: touch

>3.通过外置传参定义变量? -e

[root@manager project1]# ansible-playbook -i hosts test5.yml 
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]
TASK [Create New File] *********************************************************
fatal: [172.16.1.7]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'g_vars' is undefined

The error appears to be in '/project1/test5.yml': line 3, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  tasks:
    - name: Create New File
      ^ here
"}
fatal: [172.16.1.8]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'g_vars' is undefined

The error appears to be in '/project1/test5.yml': line 3, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  tasks:
    - name: Create New File
      ^ here
"}

PLAY RECAP *********************************************************************
172.16.1.7                 : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
172.16.1.8                 : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

系统提示找不到定义的变量:这时候使用-e传参
[root@manager project1]# ansible-playbook -i hosts test5.yml  -e "web_vars=123"

3.变量冲突,优先级?

1.定义相同的变量不同的值,来测试变量的优先级。操作步骤如下   file_name:
  1)在plabook中定义vars变量
  2)在playbook中定义vars_files变量
  3)在inventory主机定义变量
  4)在inventory主机组定义变量
  5)在host_vars中定义变量
  6)在group_vars中定义变量  组      all组
  7)通过执行命令传递变量
 
优先级测试结果:
外置传入参数优先级最高 ---> playbook ( vars_files(共享)--->vars(私有) )  
---> host_vars  --> group_vars/group_name ---> group_vars/all

4.变量注册

[root@manager project1]# cat f8.yml 
- hosts: webservers
  tasks:
            # System_Status=$(netstat -lntp)   //这里是设定变量的意思
    - name: Get Network Status
      shell: netstat -lntp | grep "nginx"
      register: System_Status               //这儿定义的名字必须和下边的msg一样

        # echo "$System_Status"           //这里是输出结果的意思
    - name: Debug output Variables
      debug:
        msg: "{{ System_Status.stdout_lines }}"

在这里插入图片描述

5.facts变量

[root@manager project1]# ansible localhost -m setup -i hosts 查看存放所采集到的信息变量
gather_facts: no 关闭facts变量

1.根据主机的cpu信息,生成不同的配置.
	A: 1核心    work_process 1;
	B: 2核心    work_process 2;
	
2.根据主机名称设定不同配置文件
	zabbix_agent
		Server:   ===> 指向172.16.1.61
		Hostname:      web01   web02

[root@manager project1]# cat ./file/zabbix_agent.conf.j2 
Server={{ zabbix_server_ip }}
ServerActive={{ zabbix_server_ip }}
Hostname={{ ansible_hostname }}

[root@manager project1]# cat f11.yml 
- hosts: webservers
  vars:
    - zabbix_server_ip: 172.16.1.61
  tasks:
    - name: Configure zabbix-agent.conf
      template:
        src: ./file/zabbix_agent.conf.j2
        dest: /tmp/zabbix-agent.conf

3.根据主机的内存生成不同的配置文件,memcached
[root@manager project1]# cat f12.yml 
- hosts: webservers
  tasks:
    - name: Installed Memcached Server
      yum:
        name: memcached
        state: present

    - name: Configure Memcached Server
      template:
        src: ./file/memcached.j2
        dest: /etc/sysconfig/memcached
      notify: Restart Memcached Server     //这儿定义的名称必须要和下边的handlers里的name一致

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

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

[root@manager project1]# cat file/memcached.j2 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"    //使用物理内存的2分之一
OPTIONS=""

案例需求:
1.根据cpu
2.根据内存
3.根据主机名
4.Redis配置文件     bind本地地址
5.操作系统不统一

		《 变量可以进行运算  + - * // 》
			
>>>1.定义变量
	playbook
		vars			私有
		vars_files		共享
		
	inventory
		host_vars	
		group_vars
			group_vars/group_name
			group_vars/all
	外置传参
		-e   //优先级最高
		
>>>2.测试优先级
	在不改变playbook变量的情况下,使用新的值测试.

>>>3.变量注册register
	1.将任务执行的结果存储至特定的变量中
	2.可以使用debug模块将变量进行打印输出
	
	python: 字典
	json 格式化数据
	{
        k1: v1
        k2: v2
	}
4.facts  ---->>>重点

在这里插入图片描述

1.每次都会获取随机数【random】
[root@manager project1]# cat f13.yml 
- hosts: webservers
  tasks:
    - name: RANDOM
      shell:  echo "$RANDOM"
      register: System_SJ

    - name: Debug 
      debug:
        msg: "web_{{ System_SJ.stdout }}"

2.提取facts变量中的IP地址   mac地址  UUID 等等  只要唯一
	ansible_default_ipv4.address
[root@manager project1]# cat f14.yml 
- hosts: webservers
  tasks:

    - name: Debug 
      debug:
        msg: "web_{{ ansible_default_ipv4.address }}"

6.Ansible 流程控制

1.判断语句

  • 1.centos和ubuntu系统都需要安装httpd, 判断系统.
  • 2.安装软件仓库,只有web组的安装webtatic其他的主机全部跳过.
  • 3.TASK任务, TASK1任务执行成功,才会执行TASK2
1.根据不同的系统,安装不同的服务
- hosts: webservers
  tasks:
    - name: CentOS Installed Httpd Server
      yum:
        name: httpd
        state: present
      when: ( ansible_distribution == "CentOS" )

    - name: Ubuntu Installed Httpd Server
      yum:
        name: httpd2
        state: present
      when: ( ansible_distribution == "Ubuntu" )
      
2.根据主机组名安装服务      
[root@manager project1]# cat f16.yml 
- hosts: all
  tasks:
  - name: Add Nginx Yum Repository
    yum_repository:
      name: nginx
      description: Nginx Repository
      baseurl: http://nginx.org/packages/centos/7/$basearch/
    when: ( ansible_hostname is match ("web*"))

3.判断http的状态来重启服务
[root@manager project1]# cat f17.yml 
- hosts: webservers
  tasks:

    - name: Check Httpd Server
      command: systemctl is-active httpd
      register: Check_Httpd
      ignore_errors: yes

	#判断Check_Httpd.rc是否等于0,如果为0则执行任务,否则不执行
    - name: Restart Httpd Server
      systemd:
        name: httpd
        state: restarted
      when: ( Check_Httpd.rc == 0 )

2.循环语句

1.一次启动多个服务
[root@manager project1]# cat f18.yml 
- hosts: webservers
  tasks:
    - name: Systemd Nginx Status
      systemd:
        name: "{{ item }}"    #调用的变量也不变,也是固定
        state: started

--->>固定的语法格式:
      with_items:
        - nginx
        - php-fpm


2.一次拷贝多个文件
[root@manager project1]# cat f19.yml
- hosts: webservers
  tasks:
    - name: Configure nginx.conf
      copy:
        src: '{{ item.src }}'
        dest: '{{ item.dest }}'
        mode: '{{ item.mode }}'
      with_items:
        - { src: ./file/nginx.conf.j2, dest: /etc/nginx/nginx.conf, mode: '0644' }
        - { src: ./file/kold.oldxu.com.conf.j2, dest: /etc/nginx/conf.d/kold.oldxu.com.conf, mode: '0600' }

3.创建多个用户,一次创建多个? 3个用户  TASK
方式一:标准循环
[root@manager project1]# cat f20.yml 
- hosts: webservers
  tasks:
    - name: Create User
      user:
        name: "{{ item }}"

      with_items:
        - test1
        - test2
        - test3
        - test4

1.创建tt1 --> bin  tt2 -->root tt3 --->adm   附加组
[root@manager project1]# cat  f20.yml 
- hosts: webservers
  tasks:
    - name: Create User
      user:
        name: "{{ item.name }}"
        groups: "{{ item.groups }}"

      with_items:
        - { name: tt1, groups: bin }
        - { name: tt2, groups: root }
        - { name: tt3, groups: adm }
            
1.标准循环                   --->居多
	item
	with_items:
	   - test
2.字典循环:                   --->居多
    itme.name
    with_items:
        - { name: test }

3.变量循环
- hosts: webservers
  tasks:
    - name: ensure a list of packages installed
      yum: name={{ packages }} state=present
      vars:
        packages:
          - httpd
          - httpd-tools

3.handlers

--->>handlers实践:
[root@manager project1]# cat f22.yml 
- hosts: webservers
  tasks:

    - name: Installed Nginx and PHP Packages
      yum:
        name: nginx
        state: present

    - name: Configure nginx.conf 
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      #监控-->changed状态-->通知-->handlers--->name-->Restart Nginx Server
      notify: Restart Nginx Server
      #notify:
      #  - Restart Nginx Server
      #  - Restart php Server

    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes

当nginx或php配置文件发生变更才会触发此操作
  handlers:
    - name: Restart Nginx Server
      systemd:
        name: nginx
        state: restarted


3.handlers注意事项
	1.无论多少个task通知了相同的handlers,handlers仅会在所有tasks结束后运行一次。
	2.只有task发生改变了才会通知handlers,没有改变则不会触发handlers.
	3.不能使用handlers替代tasks、因为handlers是一个特殊的tasks。

4.varialbes实战

变量->facts-->判断-->循环

1.安装Rsyncd服务  (循环)
[root@manager project1]# cat rsync.yml 
- hosts: backupservers
  tasks:

    - name: Installed Rsync Server
      yum:
        name: rsync
        state: present

    - name: Configure Rsync Server
      copy: 
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "{{ item.mode }}"
      with_items:
        - { src: ./file/rsyncd.conf.j2, dest: /etc/rsyncd.conf, mode: '0644' }
        - { src: ./file/rsync.passwd.j2, dest: /etc/rsync.passwd, mode: '0600' }
      notify:
        - Restart Rsync Server

    - name: Create Group
      group:
        name: www
        gid: 666

    - name: Create User
      user:
        name: www
        uid: 666
        group: www
        create_home: no

    - name: Create Directory
      file:
        path: "/{{ item }}" 
        state: directory
        owner: www
        group: www
        recurse: yes
      with_items:
        - backup

    - name: Systemd Rsync Server
      systemd:
        name: rsyncd
        state: started
        enabled: yes

    - name: check_rsync_status
      shell: netstat -lntp |grep 873
      register: rsync_status
      ignore_errors: yes

    - name: rsync_status server
      debug:
        msg: "{{ rsync_status.stdout_lines }}"

  handlers:
    - name: Restart Rsync Server
      systemd:
        name: rsyncd
        state: restarted


2.安装Redis   (bind  本地IP地址)    facts 
[root@manager project1]# cat redis.yml 
- hosts: redis
  tasks:

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

    - name: Configure redis.conf
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "{{ item.mode }}"
      with_items:
        - { src: ./file/redis.conf, dest: /etc/redis.conf, mode: '0640' }
      notify:
        - Restart redis server

    - name: Systemd start redis
      systemd:
        name: redis
        state: started
        enabled: yes

    - name: check_redis_status
      shell: netstat -lntp |grep redis
      register: systemctl_status_redis
 
    - name: redis_status server
      debug: 
        msg: "{{ systemctl_status_redis.stdout_lines }}"

  handlers:
    - name: Restart redis server
      systemd:
        name: redis
        state: restarted


3.安装NFS      (配置文件,创建目录,客户端挂载)    变量
服务端剧本:
[root@manager project1]# cat nfs_server.yml 
- hosts: nfs
  vars_files: ./vars_file.yml
  tasks:
    - name: Installed NFS Server
      yum:
        name: nfs-utils
        state: present

    - name: Configure NFS Server
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        mode: "{{ item.mode }}"
      with_items:
        - { src: ./file/exports.j2, dest: /etc/exports, mode: '0644' }
      notify:
        - Restart NFS Server

    - name: Configure Group
      group:
        name: www
        gid: 666

    - name: Configure User
      user:
        name: www
        uid: 666
        group: www
        create_home: no
        shell: /sbin/nologin
       
    - name: Create NFS shard directory
      file:
        path: "{{ mount }}"
        state: directory
        owner: www
        group: www
        recurse: yes

    - name: Systemd NFS Server
      systemd:
        name: nfs
        state: started
        enabled: yes
 
  handlers:
    - name: Restart NFS Server
      systemd:
        name: nfs
        state: restarted
        enabled: yes

客户端剧本:
[root@manager project1]# cat nfs_client.yml 
- hosts: backup
  vars_files: ./vars_file.yml
  tasks:
 
    - name: Installed nfs server
      yum:
        name: nfs-utils
        state: present
        
    - name: Mount nfs zh
      mount: 
        src: "{{ nfs_server_ip }}:{{ mount }}"
        path: /mnt
        fstype: nfs
        opts: defaults
        state: mounted

总结:

  • 1.变量
  • 2.facts
  • 3.register
  • 4.when 判断语句 ( facts )
  • 5.with_items 循环
    • 1.标准循环
    • 2.字典循环
    • 3.变量循环(忽略)
原文地址:https://www.cnblogs.com/yinwu/p/11741505.html