设为首页 收藏本站
查看: 1177|回复: 0

[经验分享] Ansible基于Playbook实现轻量化集中管理

[复制链接]

尚未签到

发表于 2018-1-3 08:44:30 | 显示全部楼层 |阅读模式
  Playbook
  一个或过个play组成的列表
  Playbook核心元素:
  Hosts:--主机
  Tasks -- 任务
  Variables -- 变量;
  Templates -- 模板 包含了模板语法的文本文件;
  Handlers: -- 由特定条件触发的任务,才叫做Handlers;
  Roles -- 角色
  Tags -- 标签
  notify -- 触发事件参数
  Hosts -- 运行指定任务的目标主机
  remoute-user -- 在远程主机上执行任务的用户
  sudo_user
  tasks -- 任务列表
  调用模块,模块参数
  格式:
  1, action:module arguments
  2, module:arguments
  运行playbook的方式:
  (1)测试
  实例1:
  vim first.yaml  --yaml格式简单编写
  - hosts: all
  remote_user: root
  tasks:
  - name: create a user3
  user: name=user3 system=true uid=307
  - name: create a user2
  user: name=user2 system=true uid=308
  ansible-playbook --check first.yaml 只检测可能发生的改变,但不真正执行操作
  ansible-playbook --list-hosts first.yaml 列出运行任务的主机
  (2)运行
  ansible-playbook first.yaml
  注意: shell和command模块后面直接跟命令,而非ket=vaule类的参数列表
  1,某任务的状态在运行后卫changed时,可通过notifly通知给相应的Handlers;
  处理器:
  Handlers -- 任务:在特定条件下触发,接受到其他任务的通知时被触发
  notify
  实例2:
  vim web-2.yaml
  - hosts: webser
  remote_user: root
  tasks:
  - name: install httpd package
  yum: name=httpd state=present
  - name: install configure file
  copy: src=files/httpd.conf dest=/etc/httpd/conf/
  notify: restart httpd
  - name: start httpd service
  service: name=httpd state=started
  handlers:
  - name: restart httpd
  service: name=httpd state=restarted
  实例3:
  vim web-3.yaml
  - hosts: webser
  remote_user: root
  tasks:
  - name: install httpd package
  yum: name=httpd state=present
  tags: insthttpd
  - name: install configure file
  copy: src=files/httpd.conf dest=/etc/httpd/conf/
  tags: insthttpd
  notify: restart httpd
  - name: start httpd service
  service: name=httpd state=started
  tags: starthttpd
  handlers:
  - name: restart httpd
  service: name=httpd state=restarted
  2,任务可以通过tags打标签,而后可在ansible-playbook命令上使用,使用-t进行调用
  ansible-playbook -t insthttpd --check web-3.yaml -- 只执行标签tags定义的内容
  varlables:
  1. facts -- 可直接调用
  2. ansible-playbook命令的命令行中的自定义变量 -e VARS, --extra-vars=VARS
  3. 通过roles传递变量;
  4. Hosts Inventory  -- 向不同的主机传递不同的变量
  IP/HOSTNAME varalable=value var2=value2
  向组中的主机传递相同的变量
  实例4:
  vim varlables.yaml
  - hosts: webser
  remote_user: root
  tasks:
  - name: install {{ pkname }}
  yum: name={{ pkname }} state=present
  ansible-playbook -e pkname=vsftpd state=present
  实例5:
  vim web-4.yaml
  - hosts: webser
  remote_user: root
  tasks:
  - name: set hostname
  hostname: name={{ hname }}
  vim /etc/ansible/hosts
[webser]

  118.145.14.93 hname=www1
  118.145.14.163 hname=www2
  ansible-playbook hostname.yaml -- 通过hosts变量传递playbook变量
  5. (注意)Inventory参数:
  用于定义ansible远程连接目标主机时使用的参数,二期传递给playbook的变量
  ansible_ssh_host
  ansible_ssh_port
  ansible_ssh_user
  ansible_ssh_pass
  ansible_sudo_pass
  Templates
  Templates模块 基于模板方式生成一个文件复制到远程主机
  *src=
  *dest=
  owner=
  group=
  mode=
  实例6:
  - hosts: webser
  remote_user: root
  tasks:
  - name: install nginx
  yum: name=nginx state=present
  - name: install conf file
  template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
  tags: instconf
  - name: start nginx service
  service: name=nginx state=started
  handlers:
  - name: restart nginx
  service: name=nginx state=restarted
  模板配置文件: nginx.conf.j2 格式后缀
  worker_processes {{ ansible_processor_vcpu }};
  liseten {{ http_port }}
  vim /etc/ansible/hosts
[webser]

  118.145.14.93 http_port=80  在hosts设置变量进行传递
  118.145.14.163 http_port=8080
  条件测试:
  when语句: 在task中使用,jinja2的语法格式
  实例7:
  - hosts: webser
  remote_user: root
  tasks:
  - name: install nginx
  yum: name=nginx state=present
  - name: install conf file to 6
  template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version == "6"  -- 判断操作系统 如果匹配则触发template定义
  notify: restart nginx
  tags: instconf
  - name: install conf file to 5
  template: src=files/nginx.conf.c5.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version == "5"  -- 判断操作系统 如果匹配则触发template定义
  notify: restart nginx
  tags: instconf
  - name: start nginx started
  service: name=nginx state=started
  handlers:
  - name: restart nginx
  service: name=nginx state=restarted
  循环: 迭代,需要重复执行的任务
  对迭代项的引用: 固定变量名为"item" 而后要在task中使用with_items给定要迭代的元素列表
  列表方法
  字符串
  字典
  - name: install some packages
  yum: name={{ item }} state=present
  whith_items:
  - nginx
  - memcached
  - php-fpm
  实例8:
  - hosts: webser
  remote_user: root
  tasks:
  - name: install some packaged
  yum: name={{ item }} state=present
  with_items:
  - httpd
  - mysql
  实例9:
  - hosts: webser
  remote_user: root
  tasks:
  - name: add some groups
  group: name={{ item }} state=present
  with_items:
  - group11
  - group12
  - name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
  - {name: 'user11',group: 'group11'}
  - {name: 'user12',group: 'group12'}
  ############################################################################################
  角色roles
  角色集合:
  roles/
  mysql/
  httpd/
  nginx/
  memcached/
  每个角色,以特定的层级目录结构进行组织:
  mysql/
  files/   --存放由copy或script模块等调用的文件
  template/ --查找所需要模板文件的目录
  tasks/--至少应该包含一个名为main.yml的文件,其它文件需要在此文件用需要通过include进行包含
  handlers/ --至少包含一个明文main.yml的文件,其它文件需要在此文件用需要通过include进行包含
  vars/ --至少包含一个明文main.yml的文件,其它文件需要在此文件用需要通过include进行包含
  meta/ --至少包含一个明文main.yml的文件,定义当前角色的特殊设定及其依赖关系,其它文件需要在此文件用需要通过include进行包含
  default/ --设定默认变量时使用的此目录中的main.yml文件;
  在playbook调用角色方法一:
  - hosts:webser
  remote_user: root
  roles:
  - mysql
  - memcached
  - nginx
  在playbook调用角色方法二: 传递变量
  - hosts: webser
  remote_user: root
  roles:
  -{ role:nginx,username:nginx} --通过字典方法直接使用变量更改Nginx用户名
  实例1:  实现roles目录层级结构执行ansible-playbook批量执行代码
  /etc/ansible/roles/nginx/
  ├── default
  ├── files
  ├── handlers
  │   └── main.yml
  ├── meta
  ├── tasks
  │   └── main.yml
  ├── templates
  │   └── nginx.conf.j2
  └── vars
  mkdir -p /etc/ansible/roles/nginx/{files,template,tasks,default,vars,handlers,meta}
  vim /etc/roles/nginx/tasks/main.yml <--默认执行文件,如果需要创建其它文件include引用即可
  - name: install nginx package
  yum: name=nginx state=present
  - name: install conf file
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: nginx restart
  tags: instconf
  - name: start nginx
  service: name=nginx state=started
  cp /root/files/nginx.conf.j2 /etc/ansible/roles/nginx/template/
  vim /etc/ansible/roles/nginx/handlers/main.yml
  - name: nginx restart
  service: name=nginx state=restarted
  方法一
  vim /root/ansible/nginx.yml
  - hosts: webser
  remote_user: root
  roles:
  - nginx  --直接调用roles目录下的nginx目录
  方法二
  vim /root/ansible/nginx.yml
  - hosts: webser
  remote_user: root
  roles:
  - { role:nginx,username:nginx}   --键role用于指定角色名称; 后续的k/v用于传递变量给角色;;
  还可以基于条件测试实现角色调用
  方法三:
  - hosts: all
  remote_user: root
  roles:
  - { role: nginx , when: ansible_distribution_major_version == "6" }  --根据判断进行roles安装
  - { role: vsftp , when: ansible_hostname == "www1" }
  vim /etc/ansible/roles/nginx/vars/main.yml
  username: demon    -- 通过vars 修改nginx配置文件用户名
  vim /etc/ansible/roles/nginx/template/nginx.conf.j2
  user {{ username }}; -- 将nginx.conf user: 改成vars设定好的变量名及调用
  变量vars:
  vars:
  -var1:value1
  -var2:value2
  实例2:
  - hosts: all
  remote_user: root
  vars:              -- 定义变量列表形式
  - username: testuser1
  - groupname: testgroup1
  tasks:
  - name: create group
  group: name={{ groupname }} state=present  -- 模块直接调用变量
  - name: create group
  user: name={{ username }} state=present  -- 模块直接调用变量

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431045-1-1.html 上篇帖子: 基于docker的gitlab+gitlabrunner+ansible自动部署 下篇帖子: 自动化运维工具Ansible的部署步骤详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表