ansible项目管理
利用主机模式选择主机
使用通配符匹配多个主机
- hosts: '*' # * 表示匹配所有主机
- hosts: '*.example.com' #表示匹配后面是.example.com主机名的所有
- hosts: '172.25.254.*' #表示ip前面是172.25.254的所有主机
通过列表匹配主机或主机组
- hosts: www1.example.com,www2.example.com,172.25.254.250 #通过主机名或IP
- hosts: webservers,servers #通过主机组或嵌套组
也可以将通配符和列表等一起使用
- hosts: webservers,&westos #即属于 webserver 组,也属于 westos 组
- hosts: westos,!servera.lab.example.com #匹配 westos 组中所有主机,但是 servera.lab.example.com 除外
- all,!servera.lab.example.com #所有主机除了 servera.lab.example.com
管理动态清单
编写动态清单程序
将 INI 格式的清单转换为 JSON 格式
命令:ansible-inventory -i inventory --list
转换格式后,可以清晰看到列出的主机列表信息
配置并行
在企业中我们使用ansible去配置自动化更新时,ansible的默认配置中会有一个最大连接数的设置,可以通过配置文件 /etc/ansible/ansible.cfg 查看属性:
或使用命令:ansible-config dump | grep -i forks
如果在运行ansible时需要设定最大同时连接数,在命令执行时添加参数 -f 或者 --forks 参数来指定并行数
例: ansible all -m command -a ‘date’ -f 3
在 playbook 中,我们在更新发生在负载均衡服务器,更新完成会重启,可能导致后端所有 web 服务器停止服务, 可以使用 serial 关键字来分批运行。
---
- name: Rolling update
hosts: webservers
serial: 2
tasks:
- name: Install apache
yum:
name: httpd
state: latest
notify: restart apache
handlers:
- name: restart apache
service:
name: httpd
state: restarted
**ps:**serial 参数还有一个优点:在更新时如果出现问题,那么在前 2 台发生问题是 playbook 就会 停止运行,后面的服务器不会执行,那么也就保证了服务的高可用
包含和导入文件
大型 playbook 管理起来比较复杂,可以用模块化的方式管理
两种方法:包含、导入
导入 playbook
例 1:
在主playbook中导入子playbook
- name: configure webserver
import_playbook: web.yml
#######
- name: Install web
hosts: webservers
tasks:
- import_tasks: tasks.yml
所以我们只在主playbook写任务的大框架,其他的任务执行都重写编写任务playbook,这样既方便查询管理,又使整个项目主体简介明了
注意: 使用导入时,when 等条件语句应用于导入的每个任务;循环不能作用于导入的任务
包含playbook
---
- name: Install web
hosts: webservers
tasks:
- include_tasks: tasks.yml
为外部 play 和任务定义变量
为了提高剧本的复用性,我们将任务设置为变量写入剧本,然后写包含变量的 playbook 导入包含任务的 playbook即可
例:
编写任务剧本,写入变量
---
- name: Install the {{ packages }}
yum:
name: "{{ packages }}"
state: latest
- name: Start the {{ service }}
service:
name: "{{ service }}"
enabled: true
state: started
编写包含变量值的剧本
- name:Set up web
hosts: webservers
tasks:
- name: Import task
import_tasks: task.yml
vars:
package: httpd
service: httpd
大型项目执行的目录结构说明
大型项目需要将每个块的内容分开存放,保证项目运行的顺畅,并且方便检测
差不多是这样的一个分类结构,将模块分开存放