1.Playbook详解
playbook是一个非常简单的配置管理和多主机部署系统,可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式.
核心元素
Hosts:主机
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器,当某条件满足时,触发执行的操作
Roles:角色
cat test.yaml- hosts: all remote_user: root tasks: - name: install redis yum: name=redis state=latest - name: copy config file copy: src=/root/playbook/redis.conf dest=/etc/redis.conf owner=redis notify: restart redis tags: ChangeConfigFile - name: start redis service: name=redis state=started handlers: - name: restart redis service: name=redis state=restarted# 检查yaml文件的语法是否正确ansible-playbook test.yaml --syntax-check# 检查tasks任务ansible-playbook test.yaml --list-task# 检查生效的主机ansible-playbook test.yaml --list-hosts# 干跑一遍ansible-playbook -C test.yaml# 指定从某个task开始运行ansible-playbook test.yaml --start-at-task='Copy Nginx.conf'ansible-playbook test.yaml -t ChangeConfigFile
Handlers:如果触发了指定条件,则notify就会通知handlers执行对应操作.
2.引入变量
# 引用变量,收集主机facts变量ansible-doc -s setupansible 10.0.0.51 -m setup直接引用Ansible变量- hosts: all remote_user: root tasks: - name: copy file copy: content={ { ansible_env }} dest=/opt/ansibel_env.txt自定义变量- hosts: all remote_user: root tasks: - name: install package { { pkgname }} yum: name={ { pkgname }} state=latestansible-playbook -e pkgname=memcache -C forth.yaml引用主机变量,在组的主机后面添加变量[webservers]10.0.0.51 ansibel_ssh_port=9122 ansibel_ssh_user=lixiang ansibel_ssh_pass=lixiang10.0.0.52第二种方式[webservers:vars]http_port=8080三种调用方式示例- hosts: webservers remote_user: root vars: - pbvar: playbook Var test tasks: - name: command line var copy: content={ { cmdvar }} dest=/tmp/cmd.var - name: playbook var copy: content={ { pbvar }} dest=/tmp/pb.var - name: host iventory var copy: content={ { http_port }} dest=/tmp/host.var# cmdvar传值,中间有空格,会不识别ansible-playbook -e cmdvar="command line var" vars.yaml
3.Templates介绍
# redis.conf.j2这个文件是从一个redis文件拷贝而来,修改了bind这一行head /root/playbook/redis.conf.j2bind { { ansibel_eth0.ipv4.address4}}cat templete.yaml- hosts: webservers remote_user: root tasks: - name: templete config file templete: src=/root/playbook/redis.conf.j2 dest=/tmp/redis.conf
4.条件判断
条件测试-when语句:tasks:- name: install conf file to centos7 templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf when: ansible_distribution_major_version == "7"- name: install conf file to centos6 templete: src=/path/nginx.conf.c6.j2 dest=/etc/nginx/conf.d/nginx.conf when: ansible_distribution_major_version == "6"多条件判断tasks:- name: install conf file to centos7 templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf when: - ansible_distribution == "CentOS" - ansible_distribution_major_version == "7"组合条件判断tasks:- name: install conf file to centos7 templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" ) or (ansible_distribution == "RedHat" and ansible_distribution_major_version == "7" )迭代:有需要循环执行任务时,可以使用迭代机制cat iter.yaml- hosts: webservers remote_user: root tasks: - name: install { { item }} package yum: name={ { item }} state=latest with_item: - nginx - tomcat - mariadb-server - redis
5.角色(roles)
每个角色,以特定的层级目录结构进行组织.
mysql/
files/:存放由copy或script等模块调用的文件;
templetes/:templete模块查找所需要模板文件的目录;
tasks/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
handlers/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
vars/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;
meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其它的文件需要在此文件中通过include进行包含;
default/:设定默认变量时使用此目录中的main.yaml文件.
# 配置文件中指定了roles路径roles_path=/etc/ansible/rolesmkdir -pv /etc/ansible/roles/nginx/{files,templetes,tasks,vars,handlers,meta,default}cat /etc/ansible/roles/nginx/tasks/main.yml- name: install nginx yum: name=nginx state=latest when: ansible_os_family == "RedHat"- name: install conf templete: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf tags: conf notify: restart nginx- name: create site home-directory file: path={ { ngxhomedir }} state=directory- name: create index page copy: src=index.html dest={ { ngxhomedir }}/- name: start nginx service: name=nginx state=started# 定义变量时,不用加横线cat /etc/ansible/roles/nginx/vars/main.ymlngxhomedir: /ngxdata/vhost1cat /etc/ansible/roles/nginx/files/index.ymlVhost1
cat /etc/ansible/roles/nginx/handlers/main.yml- name: restart nginx service: name=nginx state=restartedcat nginx.yml- hosts: webservers remote_user: root roles: - nginxcat /etc/ansible/roles/nginx/templetes/vhost1.conf.j2server{ listen 8080; server_name { { ansibel_fqdn}}; location / { root "/ngxdata/vhost1"; }}
参考博客:https://blog.51cto.com/13630803/2154192