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

 

                              

salt和ansible salt和ansible区别_不执行

 

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

 

简单的执行过程如下:

                   

salt和ansible salt和ansible区别_salt和ansible_02

 

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 可以查看是否成功

                    

salt和ansible salt和ansible区别_不执行_03

 

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

 

                   

salt和ansible salt和ansible区别_nginx_04

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

                 

salt和ansible salt和ansible区别_nginx_05

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

                       

salt和ansible salt和ansible区别_salt和ansible_06

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

                          

salt和ansible salt和ansible区别_计划任务_07

 

 注意:

    优先级:-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  查看有什么变化

             

salt和ansible salt和ansible区别_salt和ansible_08

                  

salt和ansible salt和ansible区别_nginx_09

  查看redis是否已经开启,已经开启了

          

salt和ansible salt和ansible区别_salt和ansible_10

 

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 已经被启动了 ,成功了

            

salt和ansible salt和ansible区别_计划任务_11

/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

 修改成功:

           

salt和ansible salt和ansible区别_salt和ansible_12

 

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 在同一级目录中