1、安装ansible
yum install -y ansible 依赖epel的yum源
2、anisble相关配置文件
/etc/ansible/ansible.cfg
/etc/ansible/hosts ---主机清单文件 定义可以管理的主机信息
/etc/ansible/roles ---角色目录
ansiable帮助手册
ansible-doc -l 列出模块目录
ansible-dic -s fetch 指定详细显示1个模块的作用
3、编写主机清单文件
把需要管理的主机IP地址写入hosts文件
4、测试是否可以管理多个主机(注意一定要可以通过密钥登录管理的主机)
ansible all -a "hostname"
5、ansible输出颜色信息说明
绿色:查看主机信息
黄色:修改了主机内容
红色:执行出错
粉色:警告信息
蓝色:anisble执行过程
6、ansible软件模块使用
command模块
1)语法格式:
ansible 主机名/主机组/ip -m 模块名 -a "动作信息"
举例:ansible 172.16.1.131 -m command -a "hostame"
2)chdir 执行action之前 切换目录
举例:ansible 172.16.1.131 -m command -a " chdir=/temp touch a.txt"
3) creates 如果文件存在就不执行,如果不存在则执行
举例:ansible 172.16.1.131 -m command -a " creates=/temp/a.txt chdir=/temp touch a.txt"
如果/temp目录下存在a.txt 则不创建,如果不存在就创建
4)removes 如果如果文件存在就执行,如果不存在则不执行
5)部分特殊字符command无法识别
比如:> < | ;
和3相反
shell模块(万能模块)
和command模块类似
1)语法格式:
ansible 主机名/主机组/ip -m shell -a "动作信息"
举例:ansible 172.16.1.131 -m shell -a "hostame"
2)chdir 执行action之前 切换目录
举例:ansible 172.16.1.131 -m shell -a " chdir=/temp touch a.txt"
3) creates 如果文件存在就不执行,如果不存在则执行
举例:ansible 172.16.1.131 -m shell -a " creates=/temp/a.txt chdir=/temp touch a.txt"
如果/temp目录下存在a.txt 则不创建,如果不存在就创建
4)removes 如果如果文件存在就执行,如果不存在则不执行
和3相反
scripts模块 可以远程执行脚本
①、编写脚本
②、运行ansible命令执行脚本
举例:ansible 172.16.1.131 -m scripts -a " /server/scripts/test.sh"
copy模块 数据信息进行批量分发
举例;ansible 172.16.1.131 -m copy -a "src=/tmp/test.txt dest=/tmp/test.bak"
常用参数:src 指定源路径
dest 指定目标路径
backup 是否备份dest上的数据 参数选项yes/no
举例:backup=yes
owner 指定属主
group 指定属组
mode 指定权限
content 修改dest的文件内容
remote_src 默认是no 如果改为yes 那么源路径就在远程主机上找
file模块 修改文件的属主和属组
举例:ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=test group=test mode=654"
其它用法:
state=参数 用来创建参数指定的文件类型 比如:文件 目录 连接
directory 创建目录
file 检查数据信息是否存在
absent 删除
hard 创建硬链接
link 创建软连接
touch 创建文件
举例:ansible 172.16.1.31 -m file -a "staus=directory dest=/temp/test"
创建test目录
ansible 172.16.1.31 -m file -a "staus=touch dest=/temp/test"
创建test文件
fetch模块
可以从远端把内容拉到本地来
yum模块
举例:ansible 172.16.1.31 -m yum -a "name=iotop state=installed"
service模块 可以操作某个服务
参数:state
=started 启动
=stoped 停止
enabled
=yes 开机自启
举例:ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"
cron模块
* * * * *
分 时 日 月 周
minute: 设置分 (0-69 0,2 * */2 ) *代表每分 */2 代表每2分
hour: 设置时
day: 设置日
month 设置月
weekday: 设置周
job: 用于指定shell文件
举例:ansible 172.16.1.31 -m cron -a "minute=0 hour=2 job=XXX"
扩展用法:
1)给定时任务设置备注名字
name 可以用来防止同样的ansible设置的定时任务重复写如cron
2)state
=absent 删除定时任务
3)批量注释
disabled=yes
mount模块 用于批量挂载
参数:src 需要挂载的存储设备或文件信息
path 挂载的目录
fstype 指定挂载类型
state
=mounted
=unmounted
user模块 批量管理用户
基本用法:name用来指定创建的用户名
ansible 172.16.1.31 -m user -a "name=XX"
扩展用法;
uid 指定UID
group 指定GID
groups 指定附加组
create_home 指定是否创建家目录
shell 指定用户shell
password 设置用户密码
PS:密码必须用加密的,不能用明文的
生成加密密码:ansible all -i localhost, -m debug -a "msg={{'123456' | password_hash('sha512','test')}}"
算法 随机参数
ping模块:远程管理测试模块 可以测试被管理设备是否能够被ansible管理
setup模块;返回系统信息
举例:ansible localhost -m setup
7、剧本编写规范:pyyaml -- 三点要求
1)、严格缩进(2个空格)
2)、冒号使用规范 冒号后面要有空格
举例:host: 172.16.1.31
3)、短横线的引用(列表)
4)、一个name下面只能有1个模块
8、创建剧本目录(举例rsync)
mkdir /etc/ansible/ansible-playbook
cd ansible-playbook
vim rsync_server.yaml
- hosts: 172.16.1.131
tasks:
- name: 01-install rsync #注释表明安装rsync
yum: name=rsync state=installed
- name: 02-copy rsyncd.conf #注释复制配置文件
copy: src=/tmp/rsyncd.conf dest=/etc/
9、如何执行剧本
1)、检查剧本语法格式
ansible-playbook --syntax-check rsync_server.yaml
2)、模拟执行剧本
ansible-playbook -C rsync_server.yaml
3)、执行剧本
ansible-playbook rsync_server.yaml
10、剧本中设置变量信息
方式一:直接剧本文件编辑
vars:
bianliang1: b1
bianliang2: b2
方式二、命令行指定
ansible-playbook --extra-vars=X=X
方式三、主机清单配置方式
[varset]
var1=v1
var2=v2
优先级:2>1>3
11、剧本中设置注册信息
-hosts: test
tasks:
- name: check server port
sheel: netstat -lntup
register: get_server_port #这个可以根据需求自定义名字,方便下面调用,实际上存储的是shell返回的结果
- name: display port info
debug: msg={{get_server_port.stdout_lines}}
12、剧本设置判断
-hosts: test
tasks:
- name: install httpd
yum: name=httpd state=installed
when: (ansible_distribution == "CentoOS")
- name: install httpd2
yum: name=httpd2 state=installed
when: (ansible_distribution == "ubuntu")
可用的系统判断信息获取(内置变量):
ansible localhost -m setup
需求可以通过上述命令查看
举例:ansible localhost -m setup -a "ansible_eth0"
如何获取ansible_eth0下的子选项ipv4地址呢
举例:ansible localhost -m setup -a "ansible_eth0[ipv4]"
13、剧本设置循环
举例:copy模块循环
copy: src=/etc/ansible/server_file/rsync_server/{{item.src}} dest={{item.dest}} mode={{item.mode}}
with_items:
- { src: 'rsyncd.conf' dest: '/etc' mode: '600'}
- { src: 'rsync.password' dest: '/etc' mode: '600'}
14、剧本设置忽略错误
ignore_errors yes
15、剧本设置标签
tags: XX 用来标记剧本中的某一个模块
使用tag
ansible -t tags XX xxx.yaml
16、剧本设置触发信息
举例:
tasks:
copy: src=/etc/ansible/server_file/rsync_server/{{item.src}} dest={{item.dest}} mode={{item.mode}}
with_items:
- { src: 'rsyncd.conf' dest: '/etc' mode: '600'}
- { src: 'rsync.password' dest: '/etc' mode: '600'}
notify: restart rsync server
.
.
.
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
17、使用剧本在测试服务器10.0.0.132上安装nfs服务 (管理服务器使用10.0.0.129) 然后再10.0.0.131上挂载这个远程服务
1)、在10.0.0.129上安装ansible软件
yum -y install ansible
2)、编辑主机清单
sudo vi /etc/ansible/hosts
把10.0.0.131/132加入主机清单
3)、在10.0.0.132/131上安装ssh服务,且能把10.0.0.129的公钥分发给10.0.0.132
10.0.0.132上:yum install -y sshd
10.0.0.129上:ssh-keygen
sshpass -pa12741274 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.132 "-o StrictHostKeyChecking=no" -p 22
sshpass -pa12741274 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.131 "-o StrictHostKeyChecking=no" -p 22
测试能够直接从10.0.0.129SSH到10.0.0.132/131
4)、测试ansible能够管理10.0.0.132
ansible 10.0.0.132 -a "hostname"
5)、创建剧本目录
mkdir /etc/ansible/ansible-playbook
6)、创建yaml剧本文件
-
hosts: 10.0.0.132
tasks:- name: 01-install rpcbind and nfs-utils
yum: name=rpcbind state=installed
yum: name=nfs-utils state=installed - name: 02-edit /etc/exports
copy: dest=/etc/exports content=/webdata 10.0.0.0/24 (rw,wedelay,root_squash,no_all_squash) - name: 03-start nfs-server
service: name=nfs state=started enabled=yes - name: 04-create shared dir
file: state=directory dest=/webdata
7)、创建客户端剧本yaml文件
- name: 01-install rpcbind and nfs-utils
-
hosts: 10.0.0.131
tasks:-
name: 01-install nfs-utils
yum: name=nfs-utils state=installed -
name: 02-mount remote dir
mount: src=10.0.0.132:/webdata path=/tmp fstype=nfs state=mounted
10、主机清单的配置方式
1)、分组方式
[web]
172.16.1.[7:9] #针对连续的ip地址可以批量写
web01
172.16.1.100:52111 #针对端口发生改变的情况
x.x.x.x
[data]
data01 ansible_ssh_host=10.0.0.131 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456 #可以代替配置SSH
x.x.x.x
x.x.x.x
PS:分组完成后 可以使用ansible web 这样的方式来访问组
11、角色配置剧本
规范:
主目录:/etc/ansible/ansible-playbook/roles
子目录架构,角色名XX:
tasks #完成主要任务
vars #存储变量
file #存储文件
handlers #存储触发后的操作
templates #如果file里文件的某个值经常改变,可以写成变量,然后把file模块改成template模块下,变量写在vars目录的yml下
12、role方式编写rsync脚本
举例: rsync和nfs服务器:10.0.0.132 rsync和nfs客户端 10.0.0.129 ansible管理端 10.0.0.129
步骤1:编写主机清单文件
vim /etc/ansible/hosts
[rsync:children]
[rsync_server]
10.0.0.132
[rsync_client]
10.0.0.129
[nfs:children]
[nfs_server]
10.0.0.130
[nfs_client]
10.0.0.129步骤1、创建ansible的角色文件
mkdir /etc/ansible/ansible-playbook/roles
cd /etc/ansible/ansible-playbook/roles
mkdir -p {nfs,rsync,}/{tasks,vars,files,handerls,templates}
步骤2、在roles目录下创建site.yaml文件,设置绑定主机和角色
cd /etc/ansible/ansible-playbook/roles
vim site.yaml
- hosts: nfs
roles:
- nfs-server
步骤3、编写role rsync
cd /etc/ansible/ansible-playbook/roles/rsync
1、脚本需要的文件在file下提前准备好
1) 准备rsyncd.conf文件
cd /etc/ansible/ansible-playbook/roles/rsync/file
vim rsyncd.conf
uid = rsync
gid = rsync
port=873
use chroot = no
max connections = 20
fake user=yes #将rsync普通用户伪装成为超级管理员 这样当客户端的root管理员传进来的文件可以用rsync用户修改其权限
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
timeout = 300
read only=false
list=false #配置客户端是否可以查看服务单的模块信息
hosts allow=10.0.0.0/24
auth users=rsync_backup
secrets file=/etc/rsync.password
[testbackup]
comment=“backup by zjm”
path=/backup
vim rsync.password
rsync_backup:123456
2、生成1个rsync的HASH密码
ansible all -i localhost, -m debug -a “msg={{‘123456’ | password_hash(‘sha512’,‘test’)}}”
结果: 6 6 6test$Uw04i0G6tyBkrmvmZN.aS5cOXf8Ryhz5HxLT5OIFzQBzTDqJpDo6YMejdXXJiDIl0efUr01hf/dSKFv.UbrMU.
3、定义可能用到的变量文件
cd /etc/ansible/ansible-playbook/roles/vars
vim main.yaml
rsync_server_address: 10.0.0.132
3、编写tasks
cd tasks
touch main.yaml rsync_server.yaml rsync_client.yaml
vim main.yaml
内容如下:
- import_tasks: rsync_server.yaml
when (ansible_all_ipv4_addresses == rsync_server)
- import_tasks: rsync_client.yamlvim rsync_server.yaml
-
-
name: 01-install rsync
yum: name=rsync state=installed -
name: 02-copy rsync.conf and rsyncd.password
copy: src={{item.src}} dest={{item.dest}} mode={{item.mode}}
loop:- { src: ‘rsyncd.conf’,dest: ‘/etc/’,mode: 600}
- { src: ‘rsync.password’,dest: ‘/etc/’,mode: 600}
-
name: 03-create-user-rsync_backup
user: name=rsync password= 6 6 6test$Uw04i0G6tyBkrmvmZN.aS5cOXf8Ryhz5HxLT5OIFzQBzTDqJpDo6YMejdXXJiDIl0efUr01hf/dSKFv.UbrMU. -
name: 04-create-backdir
file: state=directory dest=/testbackup owner=rsync group=rsync mode=755 -
name: 05-start server
service: name=rsyncd state=started enabled=yesvim rsync_client.yaml
-
name: 01-install rsync
yum: name=rsync state=installed -
name: 02-create-test-file
file: state=touch dest=/tmp/test.txt -
name: 02-test-rsync
shell: rsync -avz /tmp/test.txt rsync_backup@{{rsync_server_address}}::testbackup --password-file=/etc/rsync.password