Linux:ansible
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
备注:
handlers 中的任务本身不会被执行,但是如果遇到 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 已经被启动了 ,成功了

第二种方法检测:使用了 tags handler ,需要先修改一下 /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 在同一级目录中
lilz 详解:https://www.cnblogs.com/lilz/p/10399093.html
li-li 详解:https://www.cnblogs.com/li-li/p/10399299.html
ansible(1)
ansible(2)

浙公网安备 33010602011771号