回炉重造十一------ansible批量安装服务
1.playbook的核心组件
- Hosts 执行的远程主机列表
- Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最
少元素需包括 name 和 task,一个name只能包括一个task - Variables 内置变量或自定义变量在playbook中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- ags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此
会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地
长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
1.1ansible命令执行过程
1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出
1.2 ansible常用工具
ansible-vault
ansible-galaxy
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #创建新文件
1.3host组件
1.3.1概念:
aybook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用
于指定要执行指定任务的主机,须事先定义在主机清单中
1.3.2 host文件的书写
[servera] #组名
172.17.8.1
172.17.8.2
172.17.8.3
[serverb]
172.17.8.1
172.17.8.4
172.17.8.5
[serverc]
servera:serverb #取servera和serverb的并集
#相当于
172.17.8.1
172.17.8.2
172.17.8.3
172.17.8.4
172.17.8.5
[serverd]
servera:&server #取servera和serverb组的交集
servera:!serverb #在serevra中但不在serverb中
1.2 task列表和action组件
1.2.1 概念
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主
机上执行,即在所有主机上完成第一个task后,再开始第二个task,task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致.每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。
1.2.2 task格式
tasks:
- name: install httpd
yum: name=httpd
#或者
tasks:
- name: install httpd
yum:
name: httpd
2.编写playbook文件
2.1playbook的命令
--syntax-check #语法检查,可缩写成--syntax, 相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的
name
-v -vv -vvv #显示过程
2.2setup变量的调用
查看远程主机默认的setup变量
ansible 172.17.8.11 -m setup
#常用的setup变量
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.17.8.11"
],
"ansible_default_ipv4": {
"address": "172.17.8.11",
"alias": "eth0",
"broadcast": "172.17.8.255",
"gateway": "172.17.8.2",
"interface": "eth0",
"macaddress": "00:0c:29:87:53:a2",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "172.17.8.0",
"type": "ether"
#调用setup中的变量
格式:{{ 变量名["变量名下的分支"] }}
- hosts: host
tasks:
- name: show host ip
file:
path: /data/{{ ansible_default_ipv4["address"] }}_{{ ansible_date_time["date"] }}.log
state: touch
2.3文件中定义变量
#调用文件中的变量
vim var1.yml
---
- hosts: host
vars: #定义变量
user: weng #变量名:定义变量的值
group: shiqiang
tasks:
- name: print debug
debug:
msg: my name is {{ user }} ,my group is {{ group }} #{{ $name }}引用变量
#文件中的变量相互调用
---
- hosts: host
remote_user: root
vars:
collect_info: "/data/test/{{ansible_default_ipv4['address']}}/"
tasks:
- name: create IP directory
file: name="{{collect_info}}" state=directory
#使用变量文件
vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
remote_user: root
vars_files:
- vars.yml
tasks:
- name: install package
yum: name={{ package_name }}
tags: install
- name: start service
service: name={{ service_name }} state=started enabled=yes
3、实战案例
3.1 基于角色安装mysql5.6
[root@dns-master ansible]# tree
.
├── mysql_role.yml
├── nginx
└── roles
└── mysql
├── files #存放数据库的配置文件和安装包
│ ├── my.cnf #配置文件
│ └── mysql-8.0.25-el7-x86_64.tar.gz #mysql的安装包
├── tasks #任务列表
│ ├── group.yml
│ ├── init_data.yml
│ ├── install.yml
│ ├── linksoft.yml
│ ├── main.yml #任务列表
│ ├── mysql.conf.yml
│ ├── path.yml
│ ├── service.yml
│ ├── start_file.yml
│ ├── unarchive.yml
│ └── user.yml
└── vars
└── main.yml #定义变量参数
[root@dns-master tasks]# cat main.yml
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: linksoft.yml
- include: mysql.conf.yml
- include: init_data.yml
- include: path.yml
- include: start_file.yml
- include: service.yml
[root@dns-master tasks]# cat group.yml
- name: create group mysql
group:
name: mysql
gid: 306
[root@dns-master tasks]# cat user.yml
- name: create mysql user
user:
name: mysql
uid: 306
group: mysql
[root@dns-master tasks]# cat unarchive.yml
- name: copy tar to remote host and file mode
unarchive:
src: /data/ansible/roles/mysql/files/{{ mysql_file }}
dest: /usr/local/src
group: mysql
owner: mysql
[root@dns-master tasks]# cat linksoft.yml
- name: create linkfile /usr/local/src/mysql
file:
src: /usr/local/src/mysql-8.0.25-el7-x86_64
dest: /usr/local/src/mysql
state: link
group: mysql
owner: mysql
[root@dns-master tasks]# cat mysql.conf.yml
- name: create mysql config
copy:
src: /data/ansible/roles/mysql/files/my.cnf
dest: /etc/my.cnf
[root@dns-master tasks]# cat init_data.yml
- name: data dir
shell: /usr/local/src/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/app/mysql --basedir=/usr/local/src/mysql
[root@dns-master tasks]# cat path.yml
- name: PATH
copy:
content: 'PATH={{dest_file}}/mysql/bin:$PATH'
dest: /etc/profile.d/mysql.sh
[root@dns-master tasks]# cat start_file.yml
- name: create start mysql file
shell: /bin/cp {{dest_file}}/mysql/support-files/mysql.server /etc/init.d/mysqld;sed -Ei 's#^(basedir=)$#\1\/usr\/local\/src\/mysql#' /etc/init.d/mysqld;sed -Ei 's#^(datadir=)$#\1\/app\/mysql#' /etc/init.d/mysqld
[root@dns-master tasks]# cat service.yml
- name: start mysql
shell: chkconfig --add mysqld;/etc/init.d/mysqld start
关于ansible常用的模块功能,之前做过总结这里就不做总结了,后面还会继续改进,有的案例和内容还没总结好。先凑合这看