ansible使用一(ansible的安装及ansible经常使用模块的使用)

一、ansible概述
        Ansible是一款基于Python开发的自动化运维工具,它不须要安装客户端,使用SSH进行通讯,同时可支持系统帐号认证或秘钥认证,也支持windows客户端。node

Ansible主要组成部分:python

  (1)ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,一般是JSON格式的YML文件;linux

  (2)INVENTORY:Ansible管理主机的清单;nginx

  (3)MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义;git

  (4)PLUGINS:模块功能的补充,如链接类型插件、循环插件、变量插件、过滤插件等,该功能不经常使用。github

  (5)API:供第三方程序调用的应用程序编程接口;shell

  (6)ANSIBLE:ansible命令工具,其为核心执行工具;

编程

二、ansible的安装

(1)yum方式安装windows

#须要安装epel仓库
yum install epel-release
#安装ansible
yum install ansible

(2)使用pip方式安装(须要python2.7及以上版本支持)bash

#须要安装python-pip程序包及python-devel
yum install python-pip python-devel -y
#安装须要依赖的软件
yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y
#升级PIP至最新版本
pip install --upgrade pip
#安装ansible
pip install ansisble --upgrade

(3)源码方式安装

#安装git客户端
yum install git -y
#拉取GitHub上的源码包文件
git clone git://github.com/ansible/ansible.git --recursive
#执行env-setup脚本,安装ansible
cd ansible
source ./hacking/env-setup

(4)验证安装:

ansible --version

三、ansible的配置文件
        Ansible安装完成后,默认的配置文件存放在’/etc/ansible/’目录下,’/etc/ansible’目录的下的文件有ansible.cfg,hosts及目录roles,ansible.cfg为ansible默认的配置文件,使用的过程当中,大多数状况下使用默认的配置文件便可,特殊状况下可根据本身需求修改配置文件。Hosts为ansible远程管理的主机及主机组配置文件。

四、ansible配置管理的主机及主机组
        Ansible安装完成后,它与客户端的通讯时经过ssh通讯的,与客户端的认证方式有密码认证及公钥私钥认证,默认使用的是基于公私钥认证,为了安装考虑,建议使用默认的公私钥认证。

(1)为客户端分发公钥

#在ansible服务端生成秘钥对
ssh-keygen -t rsa
#为客户端分发公钥,主机多时可经过脚本分发
ssh-copy-id -i /root/.ssh/id_rsa.pub "user"@host

(2)定义主机和组

        Ansible对管理的主机组的配置文件为 /etc/ansible/hosts,对于功能相同的主机能够存放于同一组中,方便配置管理。也可将一个主机放在多个组中,若目标主机使用了非默认的SSH端口,能够在主机名称后使用冒号加端口来标明。

#配置一个test组,下面有三台主机
[test]
10.0.0.13
10.0.0.14
10.0.0.8
在定义主机及组时,也可为主机及组定义主机及组变量

#定义主机,并定义主机变量
[dayi123]
10.0.0.8 servername=nginx01 serverport=8011
#定义组变量,为上面定义的组test定义变量
[test:vars]
serverport=80
  在inventory中,组还能够包含其余的组,而且能够向组中的主机指定变量,而这些变量只能在ansible-playbook中使用。

五、Ansible系列命令介绍
        Ansible安装完成后,输入ansible按两次tab键,会补全全部ansible字母开头的命令,主要有七项。

(1)ansible命令的用法:

    Ansible命令是平常工做中最长使用的命令,主要的使用场景为非固化需求,临时一次性的操做。

    Ansible命令的使用语法格式为:

        ansible <host-pattern> [options]

    经常使用的参数选项有:

        -m  指定执行时使用的模块

        -u  指定远程主机运行此命令的用户

        -s  至关于sudo

        -S  使用sudo

        Ansible返回结果通常会使用红色,橘色,橘黄色显示,红色表示执行过程异常,会终止剩余任务的执行,绿色和橘黄色表示执行过程没有异常,但橘黄色表示命令执行结束后目标有状态变化,绿色表示命令执行结束后目标没有状态变化。

(2)ansible-galaxy

  经过ansible-galaxy上传下载Roles(Roles下载地址为:https://galaxy.ansible.com),

        ansible-galaxy命令使用格式:

            ansible-galaxy [init|info|install|list|remove] [--help] [options]

  也可以使用关键字查询roles:ansible-galaxy nginx

(3)ansible-pull

        Ansible-pull的做用为推送命令至远程,效率无限提高,对运维要求较高

(4)ansible-doc

        Ansible-doc是ansible模块的文档说明,对每一个模块都有详细的用法说明及案例,功能和linux的man命令相似

        Ansible-doc用法:ansible-doc [options] [module]

#列出全部的模块
ansible-doc -l
#查看摸模块的用法
ansible-doc [module]
#查看ping命令的用法
ansible-doc ping
(5)ansible-playbook

        Ansible-playbook工做机制是经过读取预先编写的playbook文件实现批量管理,实现的功能与ansible命令类似,ansible-playbook执行时后跟yml格式的playbook文件,执行事先编好的任务集。

使用方法如:ansible-playbook playbook.yml

(6)ansible-vault

        Ansible-vault主要用于配置文件加密

        用法:

            ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name

(7)ansible-console

        Ansible-console是ansible为用户提供的一款交互式工具,用户可在ansible-console虚拟出的终端上使用ansible内置的各类命令。全部的操做与shell相似,并支持tab补全。

六、ansible命令经常使用模块的使用
        ansible2.3中的模块大概有一千多个,可经过命令”ansible-doc -l”查看有那些模块,查看模块时也能够根据关键字搜索某个具体的模块名称。可经过”ansible-doc [modulename]”查看具体具体模块的用法。

(1)ping模块

  检查摸个主机或者某个组中的主机是否联通,若是联通则返回”pong”

#测试某个主机是否联通
[root@ansible ~]# ansible 10.0.0.14 -m ping
#测试某个组的主机是否联通
[root@ansible ~]# ansible test -m ping
#测试全部的主机是否联通
[root@ansible ~]# ansible all -m ping
10.0.0.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
(2)command模块

        command模块用于在被管理的客户端执行命令,可是command模块不支持管道符号”|”及”>”,”<”,”;”,”&”等一些特殊符号。

        选项:     

            reates 一个文件名,当该文件存在,则该命令不执行

            free_form 要执行的linux指令

            chdir 在执行指令以前,先切换到该目录

            removes 一个文件名,当该文件不存在,则该选项不执行

            executable 切换shell来执行指令,该执行路径必须是一个绝对路径

#查看磁盘剩余空间
[root@ansible ~]# ansible 10.0.0.13 -m command -a "df -h"
10.0.0.13 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_server1-lv_root
37G 1.1G 34G 3% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 477M 33M 419M 8% /boot
(3)shell模块

        shell模块同command模块功能基本同样,但shell模块支持特殊符号。

  选项(shell模块同command模块基本相同):

#查看是否存在用户”dayi123”,将信息保存到”/tmp/userinfo”中
[root@ansible ~]# ansible "*" -m shell -a "grep "dayi123" /etc/passwd >>/tmp/userinfo"
#查看”/tmp/userinfo”
[root@ansible ~]# ansible "*" -m shell -a "cat /tmp/userinfo"
#修改主机10.0.0.13及10.0.0.14用户”dayi123”的密码
[root@ansible ~]# ansible 10.0.0.13:10.0.0.14 -m shell -a "echo "dayi123" |passwd --stdin dayi123"
(4)copy模块

        Copy模块用于将当前主机的文件及目录拷贝到远程主机上。

        选项:

          backup 在覆盖以前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

            content 用于替代“src”,能够直接设定指定文件的值

            dest 必选项。要将源文件复制到的远程主机的绝对路径,若是源文件是一个目录,那么该路径也必须是个目录

            directory_mode 递归设定目录的权限,默认为系统默认权限

            force 若是目标主机包含该文件,但内容不一样,若是设置为”yes”,则强制覆盖,若是为”no”,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

            src 被复制到远程主机的本地文件,能够是绝对路径,也能够是相对路径。若是路径是一个目录,它将递归复制。在这种状况下,若是路径使用”/”来结尾,则只复制目录里的内容,若是没有使用”/”来结尾,则包含目录在内的整个内容所有复制。

            mode 文件或目录拷贝完成后设置权限。

            owner 文件拷贝完成后设置文件的属主

            group 文件拷贝完成后设置文件的属组

#拷贝目录
[root@ansible ~]# ansible test -m copy -a "src=/etc/cron.daily/ dest=/tmp/"
#拷贝文件
[root@ansible ~]# ansible test -m copy -a "src=jdk-8u144-linux-x64.rpm dest=/tmp/jdk.rpm"
#拷贝时若是目标目录文件存在则备份并在拷贝完成后修改文件属主权限
[root@ansible ~]# ansible "all" -m copy -a "src=/root/jdk-8u45-linux-x64.rpm dest=/home/dayi123/ mode=644 owner=dayi123 backup=yes"
(5)cron模块

        cron模块主要用于建立计划任务

        经常使用选项:

            minute=/ hour=/ day=/ month=/ weekday=/ 某个值不写,默认就是*

            name 必选项,任务的名称

            job 执行的任务,要加引号

            state 有两个选项分别为present(建立任务),absent(删除任务)

#建立时间同步的定时任务
[root@ansible ~]# ansible "all" -m cron -a "minute=1 hour=*/2 job='/usr/bin/ntpdate 10.0.0.30' name=ntpdate"
#删除定时任务
[root@ansible ~]# ansible "all" -m cron -a "name=ntpdate state=absent"
(6)fetch模块

        fetch模块它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。

        选项:

            src 远程系统上要获取的文件。

            dest 保存文件的目录

#获取远程主机上的hosts文件
[root@ansible ~]# ansible test2 -m fetch -a "src=/etc/hosts dest=/tmp"
10.0.0.13 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/10.0.0.13/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
}
(7) file模块

        file模块主要用于远程主机上的文件操做

        选项:

            force 须要在两种状况下强制建立软连接,一种是源文件不存在但以后会创建的状况下;另外一种是目标软连接已存在,须要先取消以前的软链,而后建立新的软链,有两个选项:yes|no

            group 定义文件/目录的属组

            mode 定义文件/目录的权限

            owner 定义文件/目录的属主

            path 定义文件/目录的路径

            recurse 递归的设置文件的属性,只对目录有效

            src 要被连接的源文件的路径,只应用于state=link的状况

            dest 被连接到的路径,只应用于state=link的状况

        state:

           directory 若是目录不存在,建立目录

           file 即便文件不存在,也不会被建立

           link 建立软连接

           hard 建立硬连接

           touch 若是文件不存在,则会建立一个新的文件,若是文件或目录已存在,则更新其最后修改时间

            absent 删除目录、文件或者取消连接文件

#修改文件权限
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/jdk-8u45-linux-x64.rpm owner=dayi123"
#建立软链接
[root@ansible ~]# ansible all -m file -a "src=/etc/hosts dest=/hosts state=link"
#若是目录不存在,则建立目录
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/tool state=directory"
(8)hostname模块

        Hostname模块用于批量修改主机名,修改后的主机名是永久生性的,重启后依然生效。

#修改单台主机名
[root@ansible ~]# ansible 10.0.0.13 -m hostname -a "name=ansible-client01"
10.0.0.13 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "ansible-client01",
"ansible_hostname": "ansible-client01",
"ansible_nodename": "ansible-client01"
},
"changed": true,
"name": "ansible-client01"
}
修改多态主机的名称时,须要在/etc/ansible/hosts中定义主机名的变量,而后在利用hostname模块修改。

在/etc/ansible/hosts中定义关于主机名的变量:

[test]
10.0.0.13:222 servername=ansible-client01
10.0.0.14 servername=ansible-client02
10.0.0.8 servername=ansible-server
批量修改主机名:

[root@ansible ~]# ansible test -m hostname -a "name={{ servername }}"
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "ansible-server",
"ansible_hostname": "ansible-server",
"ansible_nodename": "ansible-server"
},
"changed": true,
"name": "ansible-server"
}
(9)script模块

        Script脚本模块用于将本地的脚本复制到远程主机并在远程主机执行。

        选项:

            creates:文件名,若是这个文件存在,则该命令不执行

            free_form:本地脚本路径

            removes:文件名,这个文件不存在,则该命令不执行

#去远程主机执行脚本
[root@ansible-server ~]# ansible test -m script -a "test.sh"
10.0.0.13 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.13 closed.\r\n",
"stdout": "######################\r\n### hello linux ###\r\n######################\r\nMon Apr 9 03:43:48 CST 2018\r\n",
"stdout_lines": [
"######################",
"### hello linux ###",
"######################",
"Mon Apr 9 03:43:48 CST 2018"
]
}
#当远程主机存在指定的文件时,脚本不执行
[root@ansible-server ~]# ansible test -m script -a "test.sh creates=/tmp/test.log"
10.0.0.13| SKIPPED
(10)yum模块

        yum模块用于管理远程主机上的rpm软件包

        选项:

            config_file 指定yum配置文件

            disable_gpg_check 关闭gpg_check

            disablerepo 不启用某个源

            enablerepo 启用某个源

            name 指明要安装的程序包,能够带上版本号,能够写为rpm包的路径或url地址。

            state 对软件进行的操做,是安装仍是卸载,值为:

          present 默认的,表示安装

          lastest 安装为最新的版本

          absent 表示删除

#在全部的远程主机上安装ntpdate
[root@ansible-server ~]# ansible test -m yum -a "name=ntpdate state=present"
(11)Service模块

        servicer模块主要用于对服务的管理

        选项:

            arguments 给命令行提供一些选项

            enabled 是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。

            name 必选项,服务名称

            runlevel 运行级别

            sleep 若是执行了restarted,在则stop和start之间沉睡几秒钟

            state 对当前服务执行的动做,值有started,stopped,restarted,reloaded

#启动httpd服务
[root@ansible-server ~]# ansible 10.0.0.8 -m service -a 'name=httpd state=started'
#设置httpd服务开机自启动
[root@ansible-server ~]# ansible test -m service -a 'name=httpd enabled=yes'
(12)group模块

        group模块用于管理用户组

        选项:

            gid 指定组id。

            name 指定组名。

            state 对组的操做是建立仍是删除(present,absent)

            system 表示建立的组是否为系统组,默认为”no”,”yes”则表示建立的组为系统组。

#建立用户组
[root@ansible-server ~]# ansible test -m group -a "name=test123 gid=1000"
(13)user模块

        User模块用户管理远程主机上的用户

        选项:

            name 指定用户名

            group 设置用户的属组

            groups 设置用户的附加组

            home 设置用户的家目录

            shell 设置用户的shell

            uid 设置用户的uid

            expires 设置用户的过时时间(时间格式为时间戳格式)

            password 设定用户的密码(密码为加密后的密码)

            system 当建立用户时,值为”yes”时表示建立系统用户,默认值为”no”

            state 值为”present”表示建立用户,值为”absent”时表示删除用户

            remove 用于删除用户,结合”state=absent”使用

            createhome 是否建立用户家目录,值为”yes”时表示建立用户家目录,值为”no”时表示不建立用户家目录,默认值为”yes”

            generate_ssh_key 是否为用户生成SSH密钥。不会覆盖现有的SSH密钥。

            ssh_key_bits 可选择指定要建立的SSH密钥中的位数。

            ssh_key_passphrase 设置SSH密钥的密码。 若是没有提供密码,SSH密钥将默认没有密码。

            ssh_key_file 指定SSH密钥文件名, 若是这是一个相对的文件名,那么它将是相对于用户的主目录。

            ssh_key_type 指定要生成的SSH密钥的类型, 可用的SSH密钥类型将取决于目标主机上的实现。

#建立用户[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 shell=/bin/bash groups=test123,dayi123"#将指定的时间转化为时间戳格式[root@ansible-server ~]# date -d '2019-03-01 23:59:59' +%s 1551502799#设置用户到期时间[root@ansible-server ~]# ansible test -m user -a "name=dayi123 expires=1551502799"#删除用户[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 state=absent remove=yes"

相关文章
相关标签/搜索