ansible 是批量在远程主机上执行命令
openpyxl 操作excel表格
puppet
saltstack
ansible与saltstack对比
相同点:
都是为了同时在多台机器上执行相同的命令;
都是python开发;
不同点:
agent(salt 控制节点需要安装salt-master,被控节点需要安装salt-minion,而ansible不需要,它通过ssh来连接并控制被控节点)
配置(salt配置麻烦,ansible基本不用配置)
学习路线(salt比较陡峭,ansible比较平缓)
第三方工具(salt比较少)
开源社区的对接(salt比较少)
现有用户(salt还是比ansible少一些)
二次开发扩展的能力(ansible比较差,尤其是2.0以后)
大规模并发(200以内一样,200以上salt会好一些,当然我们也可以对ansible做一些配置使其在200以上追上salt)
Windows的支持(salt会好很多)
ansible 安装及简单远程操作
1、准备四台干净的虚拟机,如下所示
192.168.13.170(主控节点,其他三个是被控节点)
192.168.13.173
192.168.13.178
192.168.13.209
2、安装ansible
第一步: 下载epel源(也就是yum仓库)因为ansible是从epel源上下载的
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
第二步: 安装ansible
yum install -y ansible
查看ansible生成的文件:
rpm -ql ansible
'''
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
'''
ansible hosts文件的详解
vi /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character # 用#来表示注释
# - Blank lines are ignored # 空白行被忽略
# - Groups of hosts are delimited by [header] elements # 主机组 需要在【】下面
# - You can enter hostnames or ip addresses #可以写主机名或者ip地址
# - A hostname/ip can be a member of multiple groups # 一台主机可以在多个组里面
www[001:006].example.com #表示从www001到www006的机器
3、ssh的认证方式
(1)密码连接
ssh root@192.168.13.170 然后根据提示输入密码
(2)秘钥连接
命令:
ssh-keygen # 用来生成ssh的密钥对,一路回车
ssh-copy-id 192.168.13.173 # 复制秘钥到远程主机
ssh-copy-id 192.168.13.178
ansible 192.168.13.173 -m ping # 此时还不能够ping通,需要修改/etc/ansible/hosts配置文件
4、ping
系统自带的ping是ICMP协议
(1)我们之前ping命令可以测试主机之间是否相通,ansible也为我们提供了一个ping模块,先来看一下ansible都为我们提供了哪些命令,如下:
查看各种信息
# 查看ansible的命令
ansible -h
'''
ansible <host-pattern> [options]
-a MODULE_ARGS, --args=MODULE_ARGS #模块的参数
-C, --check # 检查
-f FORKS, --forks=FORKS #用来做高并发的
--list-hosts #列出主机列表
-m MODULE_NAME #模块名称
--syntax-check # 语法检查
-k 输入密码
'''
# ansible-doc查看模块的帮助信息
ansible-doc -h
'''
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
-j #以json的方式返回ansible的所有模块
-l, --list #列出所有的ansible的模块
-s #以片段式显示ansible的帮助信息
'''
#查看模块的信息
ansible-doc -s ping
ansible-doc -s command
ansible-doc -s shell
ansible-doc -s script
ansible-doc -s copy
ansible-doc -s file
ansible-doc -s fetch
(2)设置秘钥并且远程复制之后,直接ping是不通的,解决办法:
# 方法1、通过密码
ansible 192.168.13.173 -m ping -k 123 #密码
# 方法2.修改配置文件
vi /etc/ansible/hosts
文件中添加:
# ping通
192.168.13.173
192.168.13.178
192.168.13.209
# 分组
[web]
192.168.13.173
192.168.13.178
[db]
192.168.13.178
192.168.13.209
修改配置文件之后,就可以通过以下命令:
ansible 192.168.13.173 -m ping
ansible 192.168.13.178 -m ping
ansible 192.168.13.209 -m ping #错误
ssh-copy-id 192.168.13.209 # 必须复制到远程主机才能ping成功
ansible all -m ping
(3)对远程主机的几种操作(以ping为例)
#单个主机
ansible 192.168.13.173 -m ping
#多个主机
ansible 192.168.13.173,192.168.13.178 -m ping
#全部主机
ansible all -m ping
#单个组
ansible web -m ping
#多个组
#并集:
ansible web,db -m ping
ansible 'web:db' -m ping
#交集:
ansible 'web:&db' -m ping
#差集:
ansible 'web:!db' -m ping
命令模块(command、shell、script)
接下来学习ansible的模块
ansible 一共有多少个模块可以通过命令查看
[root@localhost ~]# ansible-doc -l|wc -l # 统计ansible有多少模块
2080
1、command
#查看command模块信息
ansible-doc -s command
'''
chdir 切换目录命令,编译安装时使用
creates # 不存在则执行
free_form
removes #存在则执行
stdin
warn
'''
#使用:
ansible web -a 'ls /'#第一个命令
ansible web -a 'pwd'
ansible web -a 'chdir=/tmp pwd'# 切换目录执行命令,使用场景是编译安装时使用
ansible web -a 'creates=/tmp pwd' # 用来判断/tmp目录是否存在,存在就跳过不执行操作
ansible web -a 'creates=/data pwd' # 因为data不存在,所以有才会执行pwd命令,没有也不会创建
ansible web -a 'removes=/tmp pwd' #用来判断tmp目录是否存在,存在就执行操作
ansible web -a 'removes=/data pwd' #因为data不存在,所以有才不会执行
为web组创建用户(主控点x.x.x.170执行)
ansible web -a 'useradd chen'
查看用户是否创建成功命令三种方式:(被控点执行查看)
tail -1 /etc/passwd
# chen:x:1000:1000::/home/chen:/bin/bash
tail -1 /etc/shadow
# chen:!!:17946:0:99999:7:::
id chen
# uid=1000(chen) gid=1000(chen) groups=1000(chen)
设置密码在x.x.x.173被控点中
echo '123' | passwd --stdin chen #设置密码
远程登录是否设置成功(主控点x.x.x.170中)
ssh chen@192.168.13.173 # 根据提示输入密码123
2、shell
因为command中不能包含特殊符号 <> |!;$&
#查看shell模块信息
ansible-doc -s shell
'''
chdir 切换目录命令,编译安装时使用
creates # 文件存在,则不执行
removes #文件存在,就执行
shell、python、ruby、perl 被管控机
'''
# 批量创建密码
ansible web -m shell -a 'echo "123" | passwd --stdin chen' # 批量创建修改web组中主机用户名为chen的密码,-a 中参数有|管道符,因此需要用到shell模块
# 执行可执行文件
本地执行:
bash a.sh 即可
远程执行shell脚本:执行远端主机上的shell等脚本文件
ansible 192.168.13.173 -m shell -a 'bash a.sh' # 执行远程文件方式一
ansible 192.168.13.173 -m shell -a '/root/a.sh' # 执行远程文件方式二,文件必须有执行权限,可能会需要修改权限
ansible 192.168.13.173 -m shell -a '/root/a.py' # 执行远端的Python脚本
192.168.107.131中执行: chmod 755 a.sh #添加可执行x权限
3、script
shell 模块可以执行远程主机上的脚本,内容作用于远程主机
script 模块可以执行本地主机(主控机上的脚本文件),但是脚本文件中的内容作用于远程主机(被控主机)上。
#查看script模块信息
ansible-doc -s script
'''
chdir #切换目录命令,编译安装时使用
creates #文件存在,则不执行
removes #文件存在,就执行
'''
#使用,执行主机本地脚本文件
ansible web -m script -a '/root/m.sh' # 执行本地的文件,执行管控机上的文件,文件内容作用于web组中的远程机上
ansible web -m script -a 'removes=/root/m.sh /root/m.sh' # 用来判断被管控机上是不是存在文件,如果存在,就执行,不存在就不执行
ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #用来判断被管控机上是不是存在文件,如果存在,就不执行
远程机是否存在a.sh ; 本机要执行的文件m.sh
文件模块(copy、file、fetch)
1、copy
#查看copy模块信息
ansible-doc -s copy
'''
backup #备份,以时间戳结尾
dest #目的地址
group #文件的属组
mode #文件的权限 r 4 w 2 x 1
owner #文件的属主
src #源文件# 通过md5码来判断是否需要复制
content #内容
'''
# 使用:
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' #复制本地文件的到远程主机
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755' #修改文件的权限
ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=alex' #修改文件的属主
ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=alex' # 复制本地目录到远程主机,如果改变文件的属性,则文件夹内的文件也会被改变
ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=alex' # 复制本地目录内的所有文件到远程主机
ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语\n' dest=/tmp/b.txt" # 直接将文本内容注入到远程主机的文件中
2、file
#查看file模块信息
ansible-doc -s file
'''
inode #硬盘的地址
id #获取到的是内存的地址
ln -s a.py b.py #创建软连接
ln a.py c.py #创建硬链接
注意:当源文件变化时,软连接和硬链接文件都会跟着变化
'''
#使用:
ansible db -m file -a 'path=/lzmly2 state=directory' #在远程机器上创建文件夹
ansible db -m file -a 'path=/root/q.txt state=touch' #用来在远程机器上创建文件
ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' #创建软连接src是源地址,path是目标地址
ansible db -m file -a 'path=/tmp/f state=absent' #用来删除文件或者文件夹
3、fetch
将远程机上的文件下载到主控机上
以ip创建文件夹,并保存原来的目录结构
#查看fetch模块信息
ansible-doc -s fetch
'''
dest #目的地址()
src #源地址
'''
#使用
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构
ansible db -m fetch -a 'src=/root/a.sh dest=tmp'
软件相关模块(yum、pip、service)
一、yum
1、yum 和 rpm 的区别?
rpm:redhat package manager
yum可以解决依赖关系
2、查看yum源配置
[root@localhost ~]# cat /etc/yum.repos.d/CentOS-Base.repo
'''
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch #名字
baseurl=http://mirrors.aliyun.com/epel/7/$basearch #rpm源的地址,可以写http,https,ftp,Samba,file:
failovermethod=priority
enabled=1 # 是否开启,1代表开启,0表示关闭
gpgcheck=0 #是否校验签名,1代表校验,0表示校验
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
'''
3、yum安装包组
[root@localhost ~]# yum grouplist
[root@localhost ~]# yum groupinstall
4、ansible 中的 yum 模块
可以在管控机上为远程机安装软件
#查看yum包信息
ansible-doc -s yum
'''
disablerepo #禁用源
enablerepo #启用源
name #包名
state # install (`present' or `installed', `latest'), or remove (`absent' or `removed')
'''
#使用
ansible web -m yum -a 'name=wget' # 在web组安装wget(yum)
ansible web -m yum -a 'name=nginx' # 在web组安装nginx
ansible web -m yum -a 'name=python2-pip' # 在web组安装python2-pip web组上安装
ansible web -m yum -a 'name=wget state=absent' # 卸载软件包
ansible web -m yum -a 'name="@Development Tools"' # 安装包组
二、pip
1、普通的 pip 的使用
pip install flask #安装包
pip freeze > a.txt #将python的环境打包到文件中
pip install -r a.txt #安装文件中的包
pip list #查看所有的以安装成功的包
2、ansible 中的 pip 模块
requeirements 用来指定文件
name 服务的名称
ansible web -m pip -a 'name=flask' # 安装flask模块
三、service
启动和关闭软件(nginx)
#查看service模块的信息
ansible-doc -s service
'''
name 名称
state 状态(started、stopped、restarted、reloaded)
enabled 设置开机自启(yes)
'''
ps -ef|grep nginx #查看进程
ss -tnlp # 查看端口信息
systemctl start nginx # centos7 启动nginx
service nginx start # centos6 启动nginx
systemctl enabled nginx # centos7 开机自启动
chkconfig nginx on # centos6开机自启动
#使用
ansible web -m service -a 'name=nginx state=started' # 启动nginx
ansible web -m service -a 'name=nginx state=stopped' # 关闭nginx
计划任务模块(corn)
1、crontab
在本机上启动计划任务
* * * * * job
分 时 日 月 周 任务
0 */2 * * * job 每隔两个小时
0 12,13 * * * job 12点和13点
0 12-17 * * * job 12点到17点
0 12-17/2 * * 1,3,6,0 周1,周3,周6,周7 12点到17点每隔两个小时
crontab -e # 编辑计划任务
crontab -l # 查看计划任务
crontab -r # 删除计划任务
2、ansible 中的 corn
给远程主机启动计划任务
#查看cron模块的信息
ansible-doc -s cron
'''
minute #分钟
hour #小时
day #天
month #月
weekday #周
job #任务
name #任务名字
disabled #禁用 (yes)表现形式是 # 号
state #状态
'''
# 使用 给db组操作
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile' # 新建一个计划任务
ansible db -m cron -a 'name=touchfile state=absent' # 删除一个计划任务
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile disabled=yes' # 禁用计划任务,以#表示禁用
注意:
不能都是*
用户相关模块(user、group)
本机用户和用户组相关的创建和删除等操作:
用户:
管理员 root 0
普通用户
系统用户 不能登录 1-999 centos7 (1-499 centos6)
登录用户 可以登录 1000-65535 centos7 (500-65535 centos6)
用户组:
管理员组 root 0
系统用户组 1-999 centos7 (1-499 centos6)
登录用户组 1000-65535 centos7 (500-65535 centos6)
#查看命令信息
useradd -h
'''
-d 指定用户的家目录
-g 指定用户的组
-G 执行用户的附加组
-s 指定登录后使用的shell
-r 创建一个系统组
'''
#用户的使用
useradd -r wusir #创建系统用户, 从999倒序
useradd -s /sbin/nologin alexsb #创建的是普通用户,从1000开始升序
useradd -d /opt/alexsb2 alexsb2 #创建用户时指定用户的家目录
useradd -u 3000 alexsb6 # 创建用户并指定用户的uid
userdel alex #删除用户
userdel -r alexsb2 #删除用户并删除用户的家目录
#用户组的使用
groupadd yuchao 创建用户组
groupdel yuchao 删除用户组
一、user
ansible中的 user 的使用
#查看user模块的信息
ansible-doc -s user
'''
group #组
groups #附加组
home #家目录
name #用户名
password #密码
remove #删除的时候会删除用的家目录!!!!(yes)
shell #用户登录后使用的shell,shell指定是否能登录nologin 不能登录
system #创建一个系统用户
uid #用来指定用户的id
state #状态(absent删除)
'''
#使用
ansible db -m user -a 'name=wulaoshi uid=4000 home=/opt/wulaoshi groups=root shell=/sbin/nologin' #创建一个用户,并指定用户的id,用户的家目录,用户的附加组,用户的shell
ansible db -m user -a 'name=wulaoshi state=absent' #删除用户但是不删除用户的家目录
ansible db -m user -a 'name=wulaoshi3 state=absent remove=yes' # 删除用户并删除用户的家目录 !!!!
#查看是否添加成功
id 用户名
tail -1 /etc/passwd
tail -1 /etc/shadow
二、group
#查看group模块的信息
ansible-doc -s group
'''
gid #组的id
name #组名
system #系统组(yes系统组 不写就是普通组)
state #状态(absent删除组)
'''
#使用
ansible db -m group -a 'name=wulaoshi system=yes' #创建系统组
ansible db -m group -a 'name=wulaoshi state=absent' # 删除组
#查看是否添加成功
/etc/group
小练习
#小练习:在web组中做如下操作
1、创建一个用户组alex10
ansible web -m group -a 'name=alex10'
2、创建一个用户wusir10
ansible web -m user -a 'name=wusir10'
3、把/etc/fstab文件复制到远程主机上/tmp/f
ansible web -m copy -a 'src=/etc/fstab dest=/tmp/f'
4、安装nginx,并启动,设置开机自启动
ansible web -m yum -a 'name=nginx'
ansible web -m service -a 'name=nginx enabled=yes'
获取远程机器系统信息模块(setup)
查看某台系统的信息或者某个组下机器的系统信息
[root@localhost ~]# ansible 192.168.13.173 -m setup #某台机器
[root@localhost ~]# ansible web -m setup # web组下的信息
'''
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python
'''
#使用
ansible cache -m setup -a 'filter=*processor*' # 用来搜索 filter
ansible剧本(ansible-playbook)
为什么使用剧本?
可以重复的执行配置文件中的一些命令
1、yaml 简介
当需要重复执行某操作(命令)时,并且不管执行多少遍,所得到的结果都是一样的,这种特性叫做幂等性。
可以将该操作的命令写成配置文件,需要用到 yaml 语言
yaml 是一种编程语言,(xml、ini、yaml)都是可以用来写配置文件的的一个语言
yaml字典结构:key:value
列表 - :[] -
文件后缀名:.yaml .yml
书写字典格式注意点:
冒号后面必须要空格
等号后面不能有空格
- 后面也要有空格
严格对齐
2、ansible-playbook 的命令格式
执行顺序:配置文件从上往下执行
特性:幂等性,不管执行多少遍,结果都是一样的
#查看ansible-playbook信息
ansible-playbook -h
'''
ansible-playbook [options] playbook.yml [playbook2 ...]
-C, --check # 检查,白跑,干跑
-f FORKS, --forks=FORKS #用来做并发
--list-hosts # 列出主机列表
--syntax-check # 语法检查
'''
#简单使用 为web组 创建用户组chen10 和 用户 zhang10
首先创建一个p2.yml文件
[root@localhost ~]# vi p2.yml
添加一下任务,要严格控制语法,空格等。
'''
- hosts: web
tasks:
- name: creategroup
group: name=chen10
- name: createuser
user: name=zhang10
'''
检查语法错误
ansible-playbook --syntax-check p2.py
执行
[root@localhost ~]# ansible-playbook p2.yml
简单的执行过程如下:
1、传参的使用
上面的简单使用中,配置文件中的任务是写死的,必须创建的组名和用户名是固定的,如果后期想给其他的主机也添加,需要修改配置文件比较麻烦,因此这里可以设置传参,配置文件中有了变量的概念。
任务:为web组创建用户
1)修改配置文件 /root/p1.yml
#创建 p1.yml文件,并添加内容
[root@localhost ~]# vi p1.yml
'''
- hosts: web
tasks:
- name: create{{ user }}
user: name={{ user }}
'''
#检查语法是否正确
[root@localhost ~]# ansible-playbook --syntax-check p1.yml
1)方式一
- e 'user=用户名'
[root@localhost ~]# ansible-playbook -e 'user=chen2' p1.yml #创建 chen2 的用户 ,通过 id chen2 可以查看是否成功
2)方式二
修改hosts配置文件
#修改hosts文件
[root@localhost ~]# vi /etc/ansible/hosts
分组时修改
[web]
192.168.13.173 user=chen3
192.168.13.178 user-chen4
[db]
192.168.13.178
192.168.13.209
#执行
[root@localhost ~]# ansible-playbook p1.yml
3)方式三
hosts文件中 写入vars
#修改hosts文件
[root@localhost ~]# vi /etc/ansible/hosts
分组时修改
[web]
192.168.13.173
192.168.13.178
[db]
192.168.13.178
192.168.13.209
[db:vars]
user=chen5 # 178 209 都创建chen5
#执行
[root@localhost ~]# ansible-playbook p1.yml
4) 方式四
直接在 .yml中添加vars变量
#修改
[root@localhost ~]# vi p3.yml
'''
- hosts: web
vars:
- user: chen6
tasks:
- name: create{{ user }}
user: name={{ user }}
'''
#执行
[root@localhost ~]# ansible-playbook p1.yml
5)方式五
.yml中可以创建了任务,并且将值返回该前面
需要在web组中下载 bc ,因为配置文件中用到了bc
ansible web -m yum -a 'name=bc' # bc是用于计算的一个包
#修改 创建了用户名15
[root@localhost ~]# vi p4.yml
'''
- hosts: web
tasks:
- name: sum
shell: echo 7+8|bc
register: user
- name: createuser
user: name={{user.stdout}}
'''
#执行
[root@localhost ~]# ansible-playbook p4.yml
注意:
优先级:-e > playbook vars > hosts文件
2、when 条件判断
1、为什么使用条件判断?
不同的系统,不同的版本,不同的环境,不同的用户,可能想要执行的操作命令不一样,这个时候就可以使用条件判断。
比如 ubuntu 安装包的方式是 apt-get
2、示例
[root@localhost yml]# vi p1.yml
'''
- hosts: db
remote_user: root
tasks:
- name: createfile
copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
when: a=="3"
- name: cratefile
copy: content="小弦切切如私语" dest=/tmp/a.txt
when: a=="4"
'''
检查语法并执行
[root@localhost yml]# ansible-playbook --syntax-check p1.yml
[root@localhost yml]# ansible-playbook -e 'a="3"' p1.yml #当有参数的时候必须要传参 -e 因为只会执行第一个任务createfile
备注:以上语法
当a=="3"时,才会执行createfile,第一个任务
当a=="4"时,才会执行cratefile,第二个任务
3、tags 标签
1、为某一个任务添加标签,当遇到标签的时候,只执行标签所对应的任务,其他任务不执行
-t 标签名
2、示例
[root@localhost yml]# vi p2.yml
'''
- hosts: web
tasks:
- name: installnginx
yum: name=nginx
- name: copyfile
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
tags: copyfile
- name: start
service: name=nginx state=started
'''
检查语法并执行
[root@localhost yml]# ansible-playbook --syntax-check p1.yml
[root@localhost yml]# ansible-playbook -t copyfile p2.yml # -t 标签名
备注:
以上示例,仅执行了copyfile任务
4、with_items (循环、嵌套循环)
1、循环
需求:一次性创建多个用户
[root@localhost yml]# vi p3.yml
'''
- hosts: web
tasks:
- name: crateuser
user: name={{item}}
with_items:
- alex20
- alex21
- alex22
'''
检查语法并执行
[root@localhost yml]# ansible-playbook --syntax-check p3.yml
[root@localhost yml]# ansible-playbook p3.yml
需求:一次性创建多个用户 和多个用户组
[root@localhost yml]# vi p4.yml
'''
- hosts: web
tasks:
- name: crateuser
user: name={{item}}
with_items:
- alex30
- alex31
- alex32
- name: crategroup
group: name={{item}} #这里必须是item 可以与上面的item重复
with_items:
- wulaoshi20
- wulaoshi21
- wulaoshi22
'''
检查语法并执行
[root@localhost yml]# ansible-playbook --syntax-check p4.yml
[root@localhost yml]# ansible-playbook p4.yml
2、嵌套循环
需求:一次性创建多个用户 和多个用户组,并且用户和用户组分别一一对应
[root@localhost yml]# vi p5.yml
'''
- hosts: web
tasks:
- name: crategroup
group: name={{item}}
with_items:
- wulaoshi30
- wulaoshi31
- wulaoshi32
- name: createuser
user: name={{item.name}} group={{item.group}}
with_items:
- {'name':alex40,'group':wulaoshi30}
- {'name':alex41,'group':wulaoshi31}
- {'name':alex42,'group':wulaoshi32}
'''
检查语法并执行
[root@localhost yml]# ansible-playbook --syntax-check p5.yml
[root@localhost yml]# ansible-playbook p5.yml
备注:
with_items 也可以传递字典结构,通过点来取值
5、template
需求:在web组机器安装redis,将管控机上配置好的 /etc/redis.conf 文件复制到远程机上,并启动redis
1、管控机需要先安装redis,然后修改管控机上的配置文件 /etc/redis.conf
安装
yum install -y redis
修改文件
[root@localhost yml]# vi /etc/redis.conf
'''
port 16379
bind {{ansible_default_ipv4.address}} #使用的点取值,用template模块复制,可以获取到ip地址,如果使用copy,复制过去之后仍然是原字母
'''
通过setup模块去查找ip地址,通过变量取值,port端口可以先随便设置
2、 书写playbook然后执行
[root@localhost yml]# vi p6.yml
'''
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=/etc/redis.conf dest=/etc/redis.conf #这里src使用的是绝对路径,也可以使用相对路径需要创建templates文件夹
- name: start
service: name=redis state=started
'''
检查并执行
[root@localhost yml]# ansible-playbook --syntax-check p6.yml
[root@localhost yml]# ansible-playbook p6.yml
备注:
执行以后查看远程机上的复制的文件,vi /etc/redis.conf 查看有什么变化
查看redis是否已经开启,已经开启了
3、template模块中相对路径的使用
/root/yml 中创建文件夹 templates, 将修改好的 redis.conf文件复制到templates中,然后再在 .yml 文件中的 src 就可以使用相对路径了
也就是 templates 文件夹和 p7.yml 文件在同一个路径中
因此 2 中的操作也可以采用下面的方式进行
[root@localhost yml]# vi p7.yml
'''
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf #这里使用相对路径即可
- name: start
service: name=redis state=started
'''
检查并执行
[root@localhost yml]# ansible-playbook --syntax-check p7.yml
[root@localhost yml]# ansible-playbook p7.yml
备注:
修改下redis.conf中的端口 port 26379
因为前面安装了redis,这里可以将第一个任务去掉,然后将远程机上的redis进程杀掉
再次执行上面的 .yml 文件 会发现,远程机上的redis 端口已经改为 26379了,说明成功了
4、template 和 copy 的比较(都是用于复制的模块)?
copy 模块不替代参数
template 模块可以替代参数
6、handlers
使用场景:handlers 大多数用于修改配置文件的时候
handlers 中的任务不会被执行,需要 notify 来触发执行
[root@localhost yml]# vi p8.yml
'''
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
'''
检查并执行
[root@localhost yml]# ansible-playbook --syntax-check p8.yml
[root@localhost yml]# ansible-playbook -t copyfile p8.yml
备注:
notify 任务名
tags 通过 -t 传值,遇到标签,仅执行标签中的任务
因此,以上文件,会执行 copyfile restart 任务
7、roles 目录结构
1、问题
如果 db 组或者其他组也想要创建文件怎么办?可以再写一遍 .yml 但是太麻烦了
如果管控机坏掉了,这些 .yml 文件怎么办?难道要再重新写一遍?
针对以上问题就出现了 roles 目录,分角色来管理 playbook(.yml)文件。
2、roles 目录(文件夹)
优势:目录清晰,可以相互调用
文件夹里面是要创建的每一个角色,每一个角色一个文件夹
每一个角色里面都有tasks(必须的),templates,files,handlers,vars目录
每个目录都要有main.yml文件,通过import_tasks来调用
其中templates文件夹中的文件可以通过相对路径来调用
其中files文件夹中的文件是否可以通过相对路径来调用?
3、如何创建 roles ?
.
├── roles
│ ├── cache
│ ├── db
│ │ └── tasks
│ │ └── createuser.yml
│ └── web
│ ├── files
│ ├── tasks
│ │ ├── copyfile.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ └── start.yml
│ ├── templates
│ │ └── redis.conf
│ └── vars
└── web.yml
#install.yml
- name: install
yum: name=redis
#copyfile.yml
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
#start.yml
- name: start
service: name=redis state=started
#main.yml
- import_tasks: install.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml
#web.yml
- hosts: web
remote_user: root
roles:
- web
#1、创建目录结构
[root@localhost yml]# mkdir /root/yml/roles
[root@localhost yml]# cd roles
[root@localhost roles]# mkdir web
[root@localhost roles]# mkdir db
[root@localhost roles]# mkdir cache
[root@localhost roles]# mkdir -pv web/{templates,files,tasks,vars} #web中创建以上4个文件夹
'''
templates #存放文件
files #保存不需要传参的
tasks #保存任务(.yml),用于写任务
vars #保存变量
'''
#2、书写tasks任务
[root@localhost tasks]# vi install.yml
'''
- name: install
yum: name=redis
'''
注意:因为前面的测试中已经安装过了redis,因此该测试中可以先不执行安装的任务。
[root@localhost tasks]# vi copyfile.yml
''' 对应方法一:
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
'''
'''
对应方法二:
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile
notify: start
'''
[root@localhost tasks]# vi start.yml
''' 对应方法一:
- name: start
service: name=redis state=started
'''
'''
对应方法二:
handlers:
- name: start
service: name=redis state=started
'''
[root@localhost tasks]# vi main.yml
'''
- import_tasks: install.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml
'''
注意:一定要有main.yml
#3、将已经修改好端口和ip的需要复制的redis.conf文件拷贝到templates中
[root@localhost templates]# cp /etc/redis.conf /root/yml/roles/web/templates
注意:修改的端口为36379,执行完之后可以查看,redis的启动端口是否为36379,检验是否执行成功
#4、书写入口 web.yml (该文件和roles文件夹是同一级目录)
[root@localhost yml]# vi web.yml
'''
- hosts: web
remote_user: root
roles:
- web
'''
#5、执行
[root@localhost yml]# ansible-playbook web.yml
[root@localhost yml]# ansible-playbook -t copyfile web.yml #对应方法二
备注:
第一种方法之后,远程机检查 redis 已经被启动了 ,成功了
/root/yml/roles/web/templates/redis.conf 中的文件,然后修改下端口为 port 436379
该方法还存在一定的书写错误 handlers
4、如何调用别人的roles
需求:web 中向调用 db 角色中的roles 中创建用户的 yml
1)现在db 中准备一个 tasks/createuser.yml
[root@localhost db]# cd /root/yml/roles/db/tasks #进入db 组的tasks
[root@localhost tasks]# vi createuser.yml
'''
- name: createuser
user: name=chen22
'''
2)在web 中的main.yml中导入
修改main.yml
[root@localhost tasks]# cd /root/yml/roles/web/tasks
[root@localhost tasks]# vi main.yml
'''
- import_tasks: copyfile.yml
- import_tasks: start.yml
- import_tasks: roles/db/tasks/createuser.yml
'''
检查并执行
[root@localhost yml]# ansible-playbook --syntax-check web.yml
[root@localhost yml]# ansible-playbook web.yml
修改成功:
5、查看整体的目录结构
下载tree
yum install -y tree
[root@localhost ~]# cd /root/yml #进入roles所在的文件夹
[root@localhost yml]# tree
--------
.
├── roles
│ ├── cache
│ ├── db
│ │ └── tasks
│ │ └── createuser.yml
│ └── web
│ ├── files
│ ├── tasks
│ │ ├── \357\274\201
│ │ ├── copyfile.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ └── start.yml
│ ├── templates
│ │ └── redis.conf
│ └── vars
└── web.yml
备注:其中 tasks 文件夹是不可或缺的,tasks中必须要 main.yml,启动的 web.yml 和 roles 在同一级目录中