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

[经验分享] L13.1 ansible playbook应用

[复制链接]

尚未签到

发表于 2018-7-30 10:32:57 | 显示全部楼层 |阅读模式
  ansible playbook应用
  一,ansible的playbook作用
  playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好做什么。
  ansible可以使用playbook灵活的批量执行远程命令,使用roles在playbook中作为模块多次,灵活的调用。
  ansilble plabook使用YAML语言
  二,YAML语法与范例
  ##YAML语法与范例
  > - YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16
  > - 使用**空白字符**(不能使用<kbd>Tab</kbd>)分层,同层元素左侧对齐
  > - 单行注解由井字号(<kbd> #</kbd> )开始,可以出现在行中任何位置
  > - 每个清单成员以单行表示,并用短杠+空白(<kbd>-  </kbd>)起始
  > - 每个杂凑表的成员用冒号+空白(<kbd>:  </kbd>)分开键和值
  > - 杂凑表的键值可以用问号 (<kbd>?</kbd>)起始,表示多个词汇组成的键值
  > - 字串一般不使用引号,但必要的时候可以用引号框住
  > - 使用双引号表示字串时,可用倒斜线(<kbd>\</kbd>)进行特殊字符转义
  > - 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号<kbd>|</kbd>)或新行折叠(使用符号<kbd>></kbd>)两种方式
  > - 在单一档案中,可用连续三个连字号(<kbd>---</kbd>)区分多个档案
  > - 可选择性的连续三个点号(<kbd>...</kbd>)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处)
  > - 重复的内容可使从参考标记星号 (<kbd>*</kbd>)复制到锚点标记(<kbd>&</kbd>)
  > - 指定格式可以使用两个惊叹号 ( !! ),后面接上名称
  
  注意点:
  (1),在YAML中必须使用空格进行缩进,不能使用tab
  (2),使用一个跟着空格的“-”符号来声明一个序列。
  - hosts
  (3),使用一个跟着空格的冒号标记每一个键值对来声明一个散列表。
  - hosts: websrc
  (4),一个序列可以写成方括号 [] 中逗号分隔的列表形式;
  [PHP,Perl,Python]
  一个散列表可以写成大括号{}中逗号分隔的键值对列表的形式;
  { PHP: 5.2,MySQL: 5.5,Apache: 2.2.20}
  (5),注释加#号
  
  示例1: 安装apache,复制本地配置文件到远程主机,(当配置文件改变的时候触发notify重启httpd)启动httpd服务
  vim /etc/ansible/hosts  #定义配置文件
  192.168.0.21
  [web]
  192.168.0.22
  192.168.0.23
  正常运行:
  #ansible-playbook playbook1.yml
  仅运行tags
  #ansible-playbook playbook1.yml --tags=1
  代码:
  #playbook1.yml
  - hosts: web
  remote_user: root
  vars:
  - Sname1: httpd
  - Sname2: mysql
  tasks:
  - name: install ` Sname1 `
  yum: name=` Sname1 ` state=latest     #使用定义的变量
  - name: copy config file
  tags: 1   #仅运行copy config file,其他忽略。
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify:    #当配置文件改变的时候,触发notify,重启httpd,notify和之上的并列书写。
  - restart httpd
  - name: start httpd
  service: name=httpd state=started
  - name: install  ` Sname2 ` on node3
  yum: name=mysql-server state=latest
  when: ansible_hostname == "node3"    #只给主机名为node3的安装mysql-server,ansible_hostname为(ansible web -m setup获取的变量信息)
  - name: add several users  #迭代,当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可
  user: name={{ item }} state=present groups=wheel
  with_items:
  - testuser1
  - testuser2
  handlers:
  - name: restart httpd
  service: name=httpd state=restarted
  三,Templates 的使用(模板的使用)
  使用场合:
  在web这个组中 192.168.0.22 和192.168.0.23 ,22需要监听httpd服务为80端口,而23需要监听8080端口,两个端口,最大连接数,主机名都不一样,之前的方法copy本地配置文件,配置文件是一致的,不能实现,所有需要使用Templates。
  思路:
  1,在模板文件内定义变量。
  2,在配置文件主机定义不同主机需要的变量。(这样可以在不同主机匹配到配置文件的时候使用的是不同的值)
  3,配置playbook文件
  1,在模板文件内定义变量。
  #mkdir /templates
  #cd /templates
  #mv /etc/httpd/conf/httpd.conf ./httpd.conf.j2   #模板文件
  #vim httpd.conf.j2
  #定义替换的变量:
  ServerName {{ ansible_fqdn }}  #setup获取的自定义变量ansible_fqdn
  Listen {{ http_port }}
  MaxClients       {{ MaxClients }}
  2,在配置文件主机定义不同主机需要的变量值
  # vim /etc/ansible/hosts
  [web]
  192.168.0.22 http_port=80 MaxClients=100
  192.168.0.23 http_port=8080 MaxClients=200
  3,配置playbook文件
DSC0000.png

  四,roles使用
  ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在
  playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用
  于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
  所有的文件都放到file目录中,所有的模板都放到templates中,所有的taks都放到taks目录中,下来只是调用即可。
  一个roles的案例如下所示:
  site.yml 主调接口
  webservers.yml
  fooservers.yml
  roles/
  common/
  files/
  templates/
  tasks/
  handlers/
  vars/
  meta/
  webservers/
  files/
  templates/
  tasks/
  handlers/
  vars/
  meta/
  而在playbook中,可以这样使用roles:
  ---
  - hosts: webservers
  roles:
  - common
  - webservers
  也可以向roles传递参数,例如:
  ---
  - hosts: webservers
  roles:
  - common
  - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }
  - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }
  甚至也可以条件式地使用roles,例如:
  ---
  - hosts: webservers
  roles:
  - { role: some_role, when: "ansible_os_family == 'RedHat'" }
  1 创建role的步骤
  (1) 创建以roles命名的目录;
  (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
  (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
  (4) 在playbook文件中,调用各角色;
  2 role内各目录中可用的文件
  tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;
  files目录:存放由copy或script等模块调用的文件;
  templates目录:template模块会自动在此目录中寻找Jinja2模板文件;
  handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
  vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
  meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;
  default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;
  示例:
  如下,使用playbook将会特别麻烦,不能进行模块话调用。
DSC0001.png

  这样可以使用roles来完成以上的部署:
  1 创建role的步骤
  (1) 创建以roles命名的目录;
  (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
  (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
  (4) 在playbook文件中,调用各角色;
  部署:
  # vim /etc/ansible/hosts
  192.168.0.21
  [websrvs]
  192.168.0.22
  192.168.0.23
  创建目录结构:web服务和数据库服务
  # mkdir -pv /ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}
DSC0002.png

  # cp /etc/httpd/conf/httpd.conf /ansible_playbooks/roles/websrvs/files/    #用httpd.conf作为静态httpd配置文件,放在file目录中
  # cd /ansible_playbooks/roles/websrvs/
  #vim tasks/main.yml   #定义tasks文件
DSC0003.png # vim handlers/main.yml  #定义handlers

DSC0004.png

  #[root@node1 ansible_playbooks]# pwd
  /ansible_playbooks
  # vim site.yml  定义主要执行的文件
  运行结果:
DSC0005.png

  这样就给两台主机按需做了配置
  实现模块化调用:
  21 使用角色websrvs
  22 使用dbsrvs
  23 两个都安装。
  # vim /ansible_playbooks/test.yml
DSC0006.png

  配置dbsrvs
  cp /etc/mysql/my.cnf roles/dbsrvs/files/
  vim roles/dbsrvs/tasks/main.yml
DSC0007.png

  vim roles/dbsrvs/handlers/main.yml
DSC0008.png

  [root@node1 ansible_playbooks]# ansible-playbook test.yml   执行
  roles:总结
  (1) 目录名同角色名;
  (2) 目录结构有固定格式:
  files: 静态文件
  templates: Jinjia2模板文件
  tasks: 至少有main.yml文件,定义各tasks;
  handlers:至少有一个main.yml文件,定义各handlers
  vars: 至少有一个main.yml文件,定义变量
  meta: 定义依赖关系等信息
  (3) site.yml中定义playbook,额外也可以有其它的yml文件;

运维网声明 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-543460-1-1.html 上篇帖子: ansible<2> 下篇帖子: ansible 原理及详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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