文章目录
1. ansible的工作流程
- 使用者使用ansible或ansible-playbook(会额外读取playbook文件)时,在服务器终端输入ansible的ad-hoc命令集或playbook后,ansible会遵循预先编排的规则将playbooks逐条拆解为play,再将play组织成ansible可识别的任务(task)。随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果临时文件执行完毕则自动删除.
2. PlayBook介绍
- playbook-剧本 介绍
- playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
- 核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器.当某条件满足时,触发执行的操作
Roles:角色
3. Ymal语言
- playbook使用yml标记语言,这是一种标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。下面通过一个简易的实例,来说明playbook的语法。【实例来自官方文档】
--- #标记文件的开始
- hosts: webservers #指定该playbook在哪个服务器上执行
vars: #表示下面是定义的变量,
http_port: 80 #变量的形式,key: value,这里http_port是变量名,80是值
max_clients: 200
remote_user: root #指定远程的用户名,这里缩进和vars保持了一致,说明变量的代码块已经结束。
tasks: #下面构成playbook的tasks,每个task都有 - name: 开始,name指定该任务的名称。
- name: ensure apache is at the latest version #指定该任务的名称。
yum: pkg=httpd state=latest #yum说明要是用的模板名称,后面指定对应的参数,这两行结合起来就相当于一个shell命令。
- name: write the apache config file #每个task之间可以使用空行来做区分。
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
#需要说明的是缩进的意义和python中缩进的意义是一样,是来区分代码块的。
ansible-playbook playbook.yml --syntax-check
检查语法是否有误
ansible-playbook playbook.yml
执行
4. Playbook小示例
4.1 httpd firewalld服务开启及 配置
- 初级版本
---
- hosts: test
tasks:
- name: install apache
yum:
name: httpd
state: present
- name: start apache
service:
name: httpd
state: started
enabled: yes
- name: start firewalld
service:
name: firewalld
state: started
enabled: yes
- name: enable http
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
2. 增加配置文件
mkdir ansible/httpd
存放httpd的配置文件
[devops@server1 ansible]$ cd httpd/
[devops@server1 httpd]$ ls
httpd.conf
---
- hosts: test
tasks:
- name: install apache
yum:
name: httpd
state: present
- name: config apache
copy:
src: httpd/httpd.conf
dest: /etc/httpd/httpd.conf
- name: start apache
service:
name: httpd
state: started
enabled: yes
- name: start firewalld
service:
name: firewalld
state: started
enabled: yes
- name: enable http
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
- 增加jinja模板的使用,以及触发器的使用
- 在 ansible目录下创建template目录,将配置文件重命名为httpd.conf.j2放在此目录中
[devops@server1 httpd]$ mv httpd.conf httpd.conf.j2
[devops@server1 httpd]$ cd ..
[devops@server1 ansible]$ mkdir templates
[devops@server1 ansible]$ mv httpd/httpd.conf.j2 templates/
[devops@server1 ansible]$ cd templates/
[devops@server1 templates]$ ls
httpd.conf.j2
vim hosts
vim templates/httpd.conf.j2
---
- hosts: test
tasks:
- name: install apache
yum:
name: httpd
state: present
- name: config apache
template:
src: templates/httpd.conf.j2
dest: /etc/httpd/httpd.conf
notify: restart apache
- name: start apache
service:
name: httpd
state: started
enabled: yes
- name: start firewalld
service:
name: firewalld
state: started
enabled: yes
- name: enable http
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
handlers:
- name: restart apache
service:
name: httpd
state: restarted
4.2 查询主机信息
vim playbook2.yml
---
- hosts: all
tasks:
- name: create hostinfo
template:
src: templates/hostinfo.j2
dest: /tmp/hostinfo
vim templates/hostinfo.j2
hostname: {
{ ansible_facts['hostname'] }}
hostip: {
{ ansible_facts["eth0"]["ipv4"]["address"] }}
DNS: {
{ ansible_facts['dns']['nameservers'][-1] }}
kernel: {
{ ansible_facts['kernel'] }}
memory_free: {
{ ansible_facts.memfree_mb }}MB
boot partition size: {
{ ansible_facts.devices.vda.partitions.vda1.size }}
- 此例在KVM虚拟机下完成,使用VMware会报错,参数找不到
[root@server20 ~]# cat /temp/hostinfo
hostname: server2
hostip: 192.168.43.2
DNS: 114.114.114.114
kernel: 3.10.0-957.el7.x86_64
memory_free: 582MB
boot partition size: 1.00 GB
4.3 对PlayBook进行加密
ansible-vault encrypt playbook.yml
对它进行加密
ansible-vault edit playbook.yml
编辑加密文件
ansible-playbook playbook.yml --ask-vault-pass
执行加密文件
ansible-vault decrypt playbook.yml
对加密文件取消加密