1.ansible批量管理服务部署
1.管理端服务器
a.安装软件
yum install -y ansible(要epel源)
01. /etc/ansible/ansible.cfg --- ansible服务配置文件
02. /etc/ansible/hosts --- 主机清单文件
03. /etc/ansible/roles --- 角色目录
b.编写主机清单文件
vim /etc/ansible/hosts
c.测试是否可以管理多个主机
ansible all -a "hostname"
d.ansible服务架构信息
1.主机清单配置
2.软件模块信息
3.基于秘钥连接主机
4.主机需要关闭selinux
5.软件剧本功能
2.ansible软件模块应用
ansible的官方文档doc.ansible.com
ansible学习模块命令:
a.列出全部模块 : ansible-doc -l
b.指定一个模块详细说明: ansible-doc -s fetch
c.查询模块在剧本中的方法: ansible-doc fetch
ansible模块的语法:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定模块) 模块名称 -a(指定动作) "执行的动作"
3.第一个模块: command(默认的模块可不写)
1.定义:command - Executes a command on a remote node 在一个远程主机上执行命令
2.基本用法: ansible all -m command -a "cat /etc/hosts"
3.扩展用法:
a. chdir: Change into this directory before running the command. ---切换目录,默认是在/root下
命令: ansbible all -m command -a "chdir=/test touch lin.txt" 切换到/test目录下,创建文件lin.txt
b. creates: If it already exists, this step won't be run. --- 如果creates=/dir/file 存在,则不执行后面动作
命令: ansible all -m command -a "chdir=/test creates=/test/lin.txt touch wen.txt" 因lin.txt存在,不能touch,如果不存在则可以touch
c. removes: If it already exists, this step will be run. 与creates相反
d. free_form(required) The command module takes a free form command to run.
There is no actual parameter named 'free form'. ;即 用command模块时,-a参数后要跟上合法的linux命令
f.PS: variables like 6ShwRLP5IXGnTa3xcQ/4N2sj4pym3fccJBykjmlayizu97knMWnsXYmywEgNESideMnIHjhvRhYW0534PFjVvB0"
}
2.mkpasswd --method=sha512 --失败
3. python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
m3BJ5CMGFWpLkcs.6iJpLuJvRBB.J3CzNbSXNJyFZZyvzzvcfWoetegViTWyTU546g0M5KzN.X38Tc//Hoq2d1KRTVMTS3HyQH6w10/'"
PS:密文一定要加上''号,因为有特殊符号在里面$
2.playbook剧本编写
01.剧本编写规范 yaml格式
a.缩进空格规范: 要用相同的空格数进行缩进
b.冒号规范: :后面要跟空格 (:结尾或在注释说明中不要加空格)
c.短横线应用- : 表示列表功能
02.剧本的执行:
a.检查剧本的语法格式:
ansible-playbook --syntax-check rsync.yaml格式
b.模拟执行剧本:
ansible-playbook -C rsync.ymal
c.执行剧本:
ansible-playbook rsync.ymal
03.rsync服务剧本编写: vim /etc/ansible/ansible_playbook/rsync.yaml格式
a.先按安装部署rsync流程来编写playbook:
- hosts: 192.168.3.18
tasks:
- name: 01-install rsyncd
yum: name=rsync state=installed
- name: 02-copy configer file
copy: src=/etc/rsyncd.conf dest=/etc/
- name: 03-create rsync user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: dest=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:lin19831214 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: 192.168.3.20
tasks:- name: 01-install rsync
yum: name=rsync state=installed - name: 02-create password file
copy: content=lin19831214 dest=/etc/rsync.password mode=600 - name: 03-create test file
file: dest=/tmp/test.txt state=touch - name: 04-check test
shell: rsync -avz /tmp/test.txt rsync_backup@192.168.3.18::ftp --password-file=/etc/rsync.password
b.剧本编写常见错误:
01.剧本语法规范是否符合(空格 冒号 短横线)
02.剧本模块使用是否正常
03.剧本中一个name标识下面只能写一个模块任务信息
04.剧本中尽量不要大量使用shell模块,有时会报错,类似用shell代替user时,当user有时,用shell会报错
3.主机清单配置:
1.分组配置主机信息
[nginx]
192.168.3.17
192.168.3.18
192.168.3.19
[data]
192.168.3.20
192.168.3.21
2.主机名符号匹配配置
a. [nginx]
192.168.3.[17:19]
b. [nginx]
nginx[01:03]
3.非标准远程端口配置(不是22端口时)
[nginx]
192.168.3.17:port号(比如522)
4.使用特殊的变量 ssh_port -- 商品 ssh_user --用户 ssh_pass --密码 ssh_host 主机名 不用/etc/hosts对照
[nginx]
192.168.3.18 ansible_ssh_port=522 ansible_ssh_user=root ansible_ssh_pass=lin123
[nginx]
nginx01 ansible_ssh_host=192.168.3.18 ansible_ssh_port=522 ansible_ssh_user=root ansible_ssh_pass=lin123
5.主机组名嵌入配置
a.[rsync:children] --- 嵌入子组信息
rsync_server
rsync_client
[rsync_server]
192.168.3.18
[rsync_client]
192.168.3.20
b.[rsync:vars]
ansible_ssh_host=192.168.3.18
ansible_ssh_port=522
ansible_ssh_user=root
ansible_ssh_pass=lin123
[rsync]
rsync01
6.ansible变量用法:
1.直接在剧本文件编写 (引用变量时要用{{ 变量 }} PS:配置文件中要修改,不然不能成功
- name: 01-install rsync
- hosts: 192.168.3.18
vars:
backupdir: /backup
passfile: /rsync.password
tasks:- name: 01-install rsyncd
yum: name=rsync state=installed - name: 02-copy configer file
copy: src=/etc/rsyncd.conf dest=/etc/ - name: 03-create rsync user
user: name=rsync create_home=no shell=/sbin/nologin - name: 04-create backup dir
file: dest={{ backupdir }} state=directory owner=rsync group=rsync - name: 05-create password file
copy: content=rsync_backup:lin19831214 dest=/etc/{{ passfile }} state=touch mode=600 - name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- name: 01-install rsyncd
- hosts: 192.168.3.20
vars:
passfile: rsync.password
tasks:- name: 01-install rsync
yum: name=rsync state=installed - name: 02-create password file
copy: content=lin19831214 dest=/etc/{{ passfile }} mode=600 - name: 03-create test file
file: dest=/tmp/test.txt state=touch - name: 04-check test
shell: rsync -avz /tmp/test.txt rsync_backup@192.168.3.18::ftp --password-file=/etc/{{ passfile }}
2.在命令行中进行指定
ansible-playbook -e(--extra-vars) backupdir=/backup -e passfile=rsync.password rsync_var.yaml
3.在主机清单文件中编写
[rsync_server:vars]
backupdir=/backup
passfile=rsync.password
[rsync_client]
192.168.3.20
[rsync_client:vars]
passfile=rsync.password
4.三个变量设置的优先级: 命令行>剧本变量>主机清单变量
- 剧本设置注册信息 ---可显示输出命令结果信息 register --
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes - name: 07-check server port
shell: netstat -tlnup|grep 874 ---端口信息
register: get_server_port ---注册端口信息 - name: display port info
debug: msg={{ get_server_port.stdout_lines }} <--注册的变量在里面
-
在剧本中设置判断信息 ----用when: 来设置
1.基本用法: - name: 03-create test file
file: dest=/tmp/nfs.txt state=touch
when: (ansible_hostname == "nfs")
- name: 03-create test file
file: dest=/tmp/mysql.txt state=touch
when: (ansible_hostname == "mysql")
- name: 04-check test
shell: rsync -avz /tmp/nfs.txt rsync_backup@192.168.3.18::nfs --password-file=/etc/rsync.password
when: (ansible_hostname == "nfs")
- name: 04-check test
shell: rsync -avz /tmp/mysql.txt rsync_backup@192.168.3.18::mysql --password-file=/etc/rsync.password
when: (ansible_hostname == "mysql")
2.setup模块可以查看被管理主机系统的详细信息 ansible 主机 -m setup
3.获取内置变量方法: ansible 主机 -m setup -a "filter=ansible_hostname"
4.常见主机信息:
"ansible_all_ipv4_addresses": ---仅显示ipv4信息
"ansible_devices" ---显示磁盘设备信息
"ansible_distribution": "CentOS" ---显示系统信息
"ansible_distribution_major_version": "7", ---显示系统主版本
"ansible_distribution_version": "7.6", ---显示系统版本
"ansible_machine": "x86_64", ---显示系统类型 32位或64位
"ansible_ens33": ---显示ens33信息
"ansible_hostname": ---显示主机名
"ansible_kernel": "3.10.0-957.el7.x86_64", ---显示内核版本
"ansible_lvm": ---LVM相关信息
"ansible_memtotal_mb": 972 ---系统总内存
"ansible_memfree_mb": 69, ---可用系统内存
"ansible_memory_mb": ---详细显示内存情况
"ansible_swapfree_mb": 2047, ---总的swap内存
"ansible_swaptotal_mb": 2047 ---swap内存的可用内存
"ansible_mounts" ---磁盘挂载情况
"ansible_processor" ---显示cpu个数 (具体显示每个cpu的型号)
"ansible_processor_vcpus": 1, ---显示cpu个数 (只显示总个数)5.获取子信息方法: (在剧本中可用,命令行有时没效果)
ansible 192.168.3.18 -m setup -a "filter=ansible_ens33[ipv4]"
9.在剧本中设置循环信息:
1.循环主要是为了合并剧本的重复模块,比如把两个copy的模块合并
2.两个模块的命令要特别的相似才行
3.用法:#copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/ mode=644
#copy: src=/etc/ansible/server_file/rsync_server/rsync.password dest=/etc/ mode=600
copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
4.用法2:yum 安装多软件时:
- name: installed pkg
yum:
name=['rsync', 'tree', 'wget', 'lrzsz']
state=installed
10.剧本执行出现错误排查
a.找到书本出现问题关键点
b.将剧本中的操作转换成模块进行操作
c.将模块的功能操作转换成linux命令:
01.本地管理主机上执行命令测试
02.远程被管理主机上执行命令测试
d.剧本执行卡死 ---ansible-playbook XX.ymal -vvvv(最多四个V)
11.剧本中设置忽略错误信息
1.通过在playbook剧本在,在报错的那行下面写上- name: 02-copy configer file
copy: rc=/etc/rsyncd.conf dest=/etc/
ignore_errors: yes
2.可以通过设置ignore_errors: yes通过忽略报错那行,可以执行下,是否下面有报错有影响
12.剧本中设置标签功能:
1.原因:主要是为了跳过正常的步骤,不会再执行,浪费时间,直接给报错那行打上tags
2.配置:- name: 02-copy configer file
copy: rc=/etc/rsyncd.conf dest=/etc/
tags: copy configer --在要执行的行下面打tags不能用纯数字
3.命令:ansible-playbook --tags='copy configer' rsync_test.yaml
13.剧本中设置触发功能:
1.原因:当nofity配置或文件改变时,通过handlers:来改变一些模块
2.配置: - name: 02-copy configer file & password file
copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server
service: name=rsyncd state=started enabled=yes
handlers: ---与tasks对齐 当rsyncd.conf配置文件修改时,才执行这下面的任务,restart rsyncd
- name: restart rsync server
service: name=rsyncd state=restarted
14.ansible性能调优:
1.原因:在执行playbook时,系统有个自动的 TASK [Gathering Facts],这个主要是收集系统的信息,架构,主机类的,影响性能有时能关闭掉
2.方法: gather_facts: no
15.ansible的playbook剧本整合
1.原因:把多个剧本整合在一起成为一个剧本进行执行
2.方法: [root@nginx ansible_playbook]# vim site.yaml
- import_playbook: rsync.yaml
- import_playbook: nfs.yaml
3.命令: ansible-playbook site.yaml
16.ansible程序roles ---规范
- name: 02-copy configer file
ansible剧本编写完问题:
01.目录结构不够规范
02.编写好的任务如何重复调用
03.服务端配置文件改动,客户端参数信息也自动变化
04.汇总剧本中没有显示主机角色信息
05.一个剧本内容信息过多,不容易进行阅读,如何进行拆分
06.这个就是引出了role的使用,也可以不用
2.规范目录结构
01.cd /etc/ansible/roles
02.mkdir {rsync,nfs} ---创建相应角色目录,可自起名字
03.mkdir {rsync,nfs}/{vars,tasks,templates,handlers,files} ---创建子目录,要和官方文档上一样
04.说明: ├── nfs
│ ├── files ---保存需要分发文件目录
│ ├── handlers ---保存触发器配置文件
│ ├── tasks ---保存要执行的动作信息文件
│ ├── templates ---保存需要分发模板文件(与files不同的是,能支持变量)
│ └── vars ---保存变量信息文件
└── rsync
├── files ---
├── handlers ---
├── tasks ---
├── templates ---
└── vars ---
05.每个子目录下的编辑文件都是main.yaml除了files目录
[root@nginx nfs]# tree
.
├── files
│ └── exports
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
└── vars
└── main.yaml
a.tasks/main.yaml: - name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
b.vars/main.yaml: Data_dir: /data
c.files/exports:
/data 192.168.3.0/24(rw,sync)
d.handlers/main.yaml:
- name: restart nfs server
service: name=nfs state=restarted
e.在roles/ vim main.yaml
- hosts: nfs_server
roles:
- nfs_server
f.可以把各个动作分成一个yaml
copy_conf.yaml : - name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server
create_dir.yaml - name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
boot-server.yaml - name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
合并:vim site.yaml - import_playbook: copy_conf.yaml
- import_playbook: create_dir.yaml
- import_playbook: boot-server.yaml
g.tasks/main.yaml --> rsync_server的
- name: 01-install rsync
- name: 01-install rsyncd
yum: name=rsync state=installed - name: 02-copy configer file
template: src=rsyncd.conf dest=/etc/ --copy变成了template 主要是加了配置文件的变量
notify: restart rsync server - name: 03-create rsync user
user: name=rsync create_home=no shell=/sbin/nologin - name: 04-create backup dir
file: dest={{ Data_dir }} state=directory owner=rsync group=rsync - name: 05-create password file
copy: content=rsync_backup:lin19831214 dest=/etc/rsync.password mode=600 - name: 06-start rsync server
service: name=rsyncd state=started enabled=yes