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\n\nThe error appears to be in '/project1/test5.yml': line 3, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: Create New File\n ^ here\n"}
fatal: [172.16.1.8]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'g_vars' is undefined\n\nThe error appears to be in '/project1/test5.yml': line 3, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: Create New File\n ^ here\n"}
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.变量循环(忽略)
3.Ansible varialbes实战的更多相关文章
- Ansible 批处理实战
软件简介 Ansible 是一款自动化运维工具,基于 Python 开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功 ...
- Ansible学习实战手记-你想要知道的可能都在这里了
最近接触了ansible工具,查找了一些资料,也做了一些总结.希望能给刚接触的新手带来一些帮助. 此总结有实际例子,大部分也是从实践中用到才逐一总结的. 当然可能肯定一定会存在一些错误和纰漏,还望大家 ...
- ansible最佳实战部署nginx
1.先看下整体目录架构 [root@bogon ~]# cd /etc/ansible/ [root@bogon ansible]# tree . ├── ansible.cfg ├── group_ ...
- Ansible快速实战指南----多机自动化执行命令、部署神器
1.需求: 需要在多台主机上,发送文件.执行命令,进行快速部署 2.ansible 远程复制文件 例子:在当前节点(20.88.14 ...
- Ansible varialbes
1.什么是变量? 以一个固定的字符串,表示一个不固定的值 version: 1.12 2.定义变量? 1.在playbook中定义变量? vars 关键字 [root@manager projec ...
- Ansible性能调优
Ansible企业实战环境中,如果管理的服务器越来越多,Ansibe执行效率会变得比较慢,可以通过优化Ansible提供工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ans ...
- ansible的优化
Ansible企业实战环境中,如果管理的服务器越来越多,Ansibe执行效率会变得比较慢,可以通过优化Ansible提供工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ans ...
- Ansible--项目实战
Ansible项目实战lnmp 项目规划 通过ansible roles配置lnmp环境,nginx通过源码编译安装,php通过源码编译安装,mysql通过yum安装(mysql源码编译超级慢)支持系 ...
- ansible自动化部署之场景应用
ansible自动化配置管理 官方网站: https://docs.ansible.com 一.安装 配置 启动 (ansible由红帽收购) (1)什么是ansible ansible是IT自动化配 ...
随机推荐
- Python爬虫从入门到精通——基本库re的使用:正则表达式【华为云技术分享】
置顶:华为云618大促火热进行中,全场1折起,免费抽主机,消费满额送P30 Pro,点此抢购. 正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在 ...
- 使用app测试Modelarts在线服务
1. 基础准备 本demo代码已上传github地址为 https://github.com/zxzxzxygithub/hwmodelartdemo clone下来之后导入android studi ...
- 即将到来的“分布式云”(DPaaS):分布式计算+ DB +存储即服务
我在区块链会议上就即将到来的公共"分布式云"系统进行了讨论,该系统将主流的公共云平台(如AWS,Azure,Google Cloud,Heroku等)与区块链和P2P网络相结合,比 ...
- 【开发者portal在线开发插件系列四】数组 及 可变长度数组
基础篇 基础场景见上面两个帖子,这里单独说明数组和可变长度数组的用法. 话不多说,开始今天的演(表)示(演) Profile和插件开发 添加一个string类型的属性: 在插件里添加一条数据上报消息: ...
- 转:Spring Boot中使用AOP统一处理Web请求日志
在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...
- mysql-常用组件之触发器
基本概念 触发器是一种特殊的存储过程,不像存储过程需要显示调用,触发器通过监控表事件(增删改操作)自动触发某条 sql 的执行,可以用于购物车加购后库存减少等场景. 触发器基本操作 1. 创建触发器 ...
- unity3d 柏林噪声 PerlinNoise 规律 算法
测试 每个小数值取100次 print(0.1); LaTest3(0.1f, 0.1f); print("Max:" + La.Max() + "|Min:" ...
- 模拟摄像头,AV视频信号线解码,PAL制 NTSC,输入解码显示,终于搞定,记录下!
模拟摄像头,AV视频信号线解码,PAL制 NTSC,输入解码显示,终于搞定,记录下! 咱们常用的摄像头,监控等,大多数都是AV信号,国内制式都是PAL,采用同轴,传输,这样的好处在于,传输距离可以很长 ...
- Java多态之动态绑定
目录 Java多态之动态绑定 引用变量的类型 编译时类型 运行时类型 方法绑定 静态绑定 动态绑定 方法表 Java多态之动态绑定 上篇回顾:多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的 ...
- display:none和visibility:hidden两者的区别
display与元素的隐藏 如果给一个元素设置了display: none,那么该元素以及它的所有后代元素都会隐藏,它是前端开发人员使用频率最高的一种隐藏方式.隐藏后的元素无法点击,无法使用屏幕阅读器 ...