ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执行。
一、ansible 清单配置文件说明
当安装ansible以后,会提供一个默认的管理清单,即/etc/ansible/hosts文件,hosts文件一般为ini 风格的文件格式,具体的格式如下,这里定义了一个分组yum ,该分组中有一台主机IP是10.101.136.33 , all:vars 的分组则是所有的主机组都能使用的变量。默认ansible 可以使用密钥的方式直接免密登陆虚拟机,也可以使用ansible_ssh_pass=密码的方式来管理资产主机。
[all:vars]
[all:vars]
ansible_ssh_user=root
ansible_ssh_port=10000
ansible_python_interpreter=/usr/bin/python2.7
[yum]
10.101.136.33
二、ansible工作模式:
1、adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令
2、是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。
我们在此处只介绍剧本模式,并结合剧本模式来说明各个模块的详细说明。
三、 详细字段说明
3.1 playbook常见的形式
1、在playbook 中直接写tasks任务,所有的任务都在一个剧本中。如下面
---
- name: 安装 Nginx
hosts: web_servers
tasks:
- name: 安装 Nginx
apt:
name: nginx
state: present
become: true
在上述任务中我们使用的yaml格式来编写任务执行的剧本。这个 Playbook 的目标是在 web_servers 组中的主机上安装 Nginx。
在一个tasks中分别定义了该任务的名字,apt:表示模块的名字name 和state表示该模块的参数。
Ansible 针对不同的任务有不同的模块。如果我们不知道某个模块的参数的意思可以使用ansible-doc -s 模块名 ,来查看该模块的参数的详细的说明,-s 表示是以简洁的方式输出。如果不加-s 则会出现详细的例子,实际在使用时,只需要在此基础上稍作修改就可以完成想要完成的任务。
下面在控制节点上创建 Ansible Playbook 文件,定义 PXC 集群的安装和配置任务。例如:
---
- name: Install PXC Cluster
hosts: pxc
become: true
tasks:
- name: Install PXC packages
apt:
name: "{{ item }}"
state: present
with_items:
- percona-xtradb-cluster-57
- percona-xtrabackup-24
- name: Configure PXC Cluster
template:
src: templates/my.cnf.j2
dest: /etc/mysql/my.cnf
notify: restart mysql
handlers:
- name: restart mysql
service:
name: mysql
#在控制节点上创建模板文件,用于生成 PXC 集群的配置文件。例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address=0.0.0.0
# PXC Settings
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=my_cluster
wsrep_cluster_address=gcomm://{{ groups['pxc'] | map('extract', hostvars, ['ansible_host']) | join(',') }}
wsrep_node_name={{ inventory_hostname }}
wsrep_node_address={{ ansible_host }}
wsrep_sst_method=xtrabackup-v2
执行 ansible-playbook -i inventory.ini pxc.yml 来完成任务的部署。
第一个模块apt 使用with_items 来循环安装指定的包,第二个模块template 通过jinjia2 的语法来动态生成集群的配置文件,第三个模块则是一个触发认为,当配置文件被修改后,在该任务执行完成时,重启该服务来保证配置文件来生效。
3.2 ansible 中变量的使用
在实际的生产过程中,我们即使不用写剧本,但是查看剧本时学会查看剧本的变量还是十分有必要的,因为ansible 的变量十分灵活,灵活则意味着复杂。
下面针对ansible 的变量我们一一来解释说明。
1、 在剧本中使用vars 来定义变量
- hosts: test
vars:
testvar1: testfile
remote_user: root
tasks:
- name: task1
file:
path: /testdir/{{ testvar1 }}
state: touch
2、在剧本中使用vars_file 来定义变量文件,在文件中存放变量
- hosts: test
remote_user: root
vars_files:
- /testdir/ansible/nginx_vars.yml
- 剧本中gather_facts=true 时ansible 将在各个主机上收集一些常用的信息,这些facts,是ansible 内置变量的一种。我们可以使用setup模块filter 来过滤显示,如果要调用该主机的系统的发行版,则可以使用 {{ansible_distribution}}来调用
- 自定义注册变量:通过register 来将命令执行的结果注册进 testvar ,在下个任务中调用testvar 就等于调用了上个任务的结果。
---
- hosts: test
remote_user: root
tasks:
- name: test shell
shell: "echo test > /var/testshellfile"
register: testvar
- name: shell module return values
debug:
var: testvar
- 通过-e 参数传递的方式来传递变量
ansible-playbook cmdvar.yml -e 'pass_var="test"
- 通过set_fact 来注册变量
---
- hosts: test
remote_user: root
tasks:
- set_fact:
testvar: "testtest"
- debug:
msg: "{{testvar}}"
- 主机变量和主机组变量
[testB]
test70 ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testB:vars]
test_group_var1='group var test'
test_group_var2='group var test2'
- 内置变量 play_hosts 、groups、inventory_dir
通过内置变量play_hosts可以获取到当前play所操作的所有主机的主机名列表,如上图中就可以获取[test70,test71]
通过groups内置变量可以获取到清单中”所有分组”的”分组信息”
10.1.1.60
test70.zsythink.net ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testA]
test60 ansible_host=10.1.1.60
test61 ansible_host=10.1.1.61
[testB]
test70 ansible_host=10.1.1.70
[test:children]
testA
testB
# ansible test70 -m debug -a "msg={{groups}}"
test70 | SUCCESS => {
"changed": false,
"msg": {
"all": [
"10.1.1.60",
"test70.zsythink.net",
"test71",
"test60",
"test61",
"test70"
],
"test": [
"test60",
"test61",
"test70"
],
"testA": [
"test60",
"test61"
],
"testB": [
"test70"
],
"ungrouped": [
"10.1.1.60",
"test70.zsythink.net",
"test71"
]}}
通过inventory_dir变量获取到ansible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible
总结:变量的优先级从低到高排列:
- 在清单中定义的组变量。
- 在清单或 Playbook 所在目录的 group_vars 子目录中定义的组变量。
- 在清单中定义的主机变量。
- 在清单或 Playbook 所在目录的 host_vars 子目录中定义的主机变量。
- 在运行时中发现的主机事实。
- (vars 和 vars_files)playbook 中的 Play 变量。
- 任务变量。
- 在命令行中定义的额外变量。
注意(如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。较窄范围(如主机变量或任务变量)优先于较宽范围(如组变量或 play 变量)。通过清单定义的变量将通过 playbook 定义的变量覆盖。在命令行中使用 --extra-vars 或 -e 选项定义的额外变量拥有最高优先级。