标签:loaded 完成 handlers apache2 系统 sys for 分享 rtu
上篇提到了ansible基本安装、配置及命令行使用,这篇分享下ansible的高级用法即playbook,在生产环境如果需要完成负责任务,如大批量服务安装配置等,可以采用playbook方式来完成,高效且易于维护。使用Playbook的好处
特点
? 易读的编排语言
? 适合配置管理和应用部署
? 非常适合部署复杂的工作
先来认识一下Playbook
自动部署Nginx
hosts: webservers
vars:
hello: Ansible
tasks:
server {
listen 80;
server_name www.ctnrs.com;
location / {
root /var/www/html;
index index.html;
}
}
.YAML语法
? 缩进表示层级关系
? 不支持制表符“tab”缩进,使用空格缩进
? 通常开头缩进 2 个空格
? 字符后缩进 1 个空格,如冒号、逗号等
? “---” 表示YAML格式,一个文件的开始
? “#”注释
playbook帮助 ansible-playbook --help
在执行前可以先检查语法ansible-playbook nginx.yml --syntax-check
.Playbook文件结构
name: play1
hosts: webservers
remote_user: root
vars:
var_name: value
tasks:
name: play2
hosts: webservers
remote_user: root
vars:
var_name: value
tasks:
.在变更时执行操作(handlers)
notify:在任务结束时触发
handlers:由特定条件触发Tasks
hosts: webservers
gather_facts: no
tasks:
name: Copy nginx configuration file
copy:
src: ./site.conf
dest: /etc/nginx/conf.d/site.conf
notify:
handlers:
.任务控制(tags)
在每一个任务中添加tags标签,可以根据指定的tags运行相应的任务。
hosts: webservers
gather_facts: no
vars:
hello: Ansible
tasks:
PLAY [webservers] ***
TASK [Copy nginx configuration file] ****
ok: [192.128.132.12]
ok: [192.128.132.14]
PLAY RECAP **
192.128.132.14 : ok=1 changed=0 unreachable=0 failed=0
192.128.132.12 : ok=1 changed=0 unreachable=0 failed=0
.Playbook文件调试
语法检查:ansible-playbook main.yml --syntax-check
打印语句:
.案例:自动部署Tomcat
hosts: 192.128.132.12
gather_facts: no
vars:
tomcat_version: 8.1.33
tomcat_install_dir: /usr/local
tasks:
name: Install jdk1.8
yum: name=java-1.8.0-openjdk state=present
name: Download tomcat
get_url: url=http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz dest=/tmp
name: Unarchive tomcat-{{ tomcat_version }}.tar.gz
unarchive:
src: /tmp/apache-tomcat-{{ tomcat_version }}.tar.gz
dest: "{{ tomcat_install_dir }}"
copy: no
.命令行
.在Inventory中定义
.在Playbook中定义
hosts: webservers
gather_facts: no
vars:
var_name: value
var_name: value
tasks:
.在Role中定义
.注册变量(register)
.系统信息变量(facts)
hosts: webservers
tasks:
.include & import 区别
include(动态):在运行时导入
? --list-tags,--list-tasks不会显示到输出
? 不能使用notify触发来自include内处理程序名称(handlers)
import*(静态):在Playbook解析时预先导入
? 不能与循环一起使用
? 将变量用于目标文件或角色名称时,不能使用inventory(主机/主机组等)中的变量
import_playbook
includetasks & importtasks
条件
hosts: webservers
tasks:
根据不同发行版安装apache服务
hosts: webservers
tasks:
name: Update apache version - yum
yum: name=httpd state=present
when: ansible_pkg_mgr == ‘yum‘
notify: restart httpd
handlers:
循环
name: with_list
debug:
msg: "{{ item }}"
with_list:
name: with_items
debug:
msg: "{{ item }}"
with_items: "{{ items }}"
5.1 .条件和循环
hosts: webservers
vars:
hello: Ansible
tasks:
{% set list=[‘one‘, ‘two‘, ‘three‘] %}
{% for i in list %}
{% if i == ‘two‘ %}
-> two
{% elif loop.index == 3 %}
-> 3
{% else %}
{{i}}
{% endif %}
{% endfor %}
{{ hello }}
{% set dict={‘zhangsan‘: ‘26‘, ‘lisi‘: ‘25‘} %}
{% for key, value in dict.iteritems() %}
{{key}} -> {{value}}
{% endfor %}
5.2 .案例:管理Nginx配置文件
hosts: webservers
gather_facts: no
vars:
http_port: 80
server_name: www.ctnrs.com
tasks:
handlers:
{% set list=[10, 12, 13, 25, 31] %}
upstream {{server_name}} {
{% for i in list %}
server 192.168.1.{{i}}:80;
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{server_name}};
}
}
标签:loaded 完成 handlers apache2 系统 sys for 分享 rtu
原文地址:https://blog.51cto.com/tuwei/2388226