青野 发表于 2018-7-30 10:32:57

L13.1 ansible playbook应用

  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: 5.2,MySQL: 5.5,Apache: 2.2.20}
  (5),注释加#号
  
  示例1: 安装apache,复制本地配置文件到远程主机,(当配置文件改变的时候触发notify重启httpd)启动httpd服务
  vim /etc/ansible/hosts#定义配置文件
  192.168.0.21
  
  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
  
  192.168.0.22 http_port=80 MaxClients=100
  192.168.0.23 http_port=8080 MaxClients=200
  3,配置playbook文件

  四,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将会特别麻烦,不能进行模块话调用。

  这样可以使用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
  
  192.168.0.22
  192.168.0.23
  创建目录结构:web服务和数据库服务
  # mkdir -pv /ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}

  # 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文件
# vim handlers/main.yml#定义handlers

  ## pwd
  /ansible_playbooks
  # vim site.yml定义主要执行的文件
  运行结果:

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

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

  vim roles/dbsrvs/handlers/main.yml

  # 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]
查看完整版本: L13.1 ansible playbook应用