ansible批量管理

一、ansible简介

ansible基于python开发的自动化运维工具,其功能实现基于ssh远程连接服务

ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能

http://www.ansible.com/   ##帮助手册

1.1 一些常用的自动化运维工具

        Puppet —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱

        SaltStack —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置 脚本更简单。

 

1.2  Ansible —基于 Pythonparamiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2 模板语言,

    更强的远程 命令执行操作 ,Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、

    编排 task(持续 交 付、无宕机更新等),采用paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连接主机。

  

1.3  Ansible 工作机制

   Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执 行,执行完之后自动删除,

   可以使用SVN 等来管理自定义模块及编排  

 

1.4  Ansible 的组成由 5 个部分组成:

 

 ①,Ansible:核心引擎(包含2个模块)

        核心模块:ansible模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态。

        自定义模块:如果核心模块不足以完成某种功能,可以添加自定义模块。

 ②,Plugins:完成模块功能的补充,包括连接插件、邮件插件等

 ③,Playbooks:定义ansible任务的配置文件,可以将多个任务定义在一个剧本中,

 ④,由ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。

 ⑤,Inventory:定义 Ansible 管理主机的清单    

 

二、特点:

1、不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端

2、不需要服务端

3、需要依靠大量的模块实现批量管理

4、配置文件/etc/ansible/ansible.cfg

 

 

 

三、准备环境:

ssh key+ansible (ansible需要先ssh认证)

1、管理机 需要配置好ssh密钥认证

2、管理机 连接到客户端1、客户端2...不需要密码

3、关闭防火墙

 

四、安装服务

yum -y install epel-release    ##安装epel源

yum -y install ansible

 

五、ansible配置文件

[root@test1 ~]# tree -F /etc/ansible/

/etc/ansible/

├── ansible.cfg     ##目前不需要修改,如果所有服务器的ssh端口变了就修改

├── hosts    ##被ansible管理的服务器IP地址列表(也可以是主机名但是主机名必须被解析)

└── roles/    ##目录下是空的

配置文件详解:

[defaults]            #通用默认配置段

#inventory = /etc/ansible/hosts                 #被控端IP或者DNS列表

#library = /usr/share/my_modules/             #ansible默认搜寻模块位置

#module_utils = /usr/share/my_module_utils/        

#remote_tmp = ~/.ansible/tmp            #ansible远程执行临时文件;

#local_tmp = ~/.ansible/tmp      

#forks = 5                            #并行进程数

#poll_interval = 15               #回频率或者轮训间隔时间

#sudo_user = root               #sudo远程执行用户名

#ask_sudo_pass = True            #使用sudo,是够需要输入密码

#ask_pass = True                   #是否需要输入密码

#transport = smart                  #通信机制

#remote_port = 22                    #远程SSH端口

#module_lang = C                   #模块和系统之间通信语言

#module_set_locale = False     

#gathering = implicit             #控制默认facts收集(远程系统变量)

roles_path= /etc/ansible/roles                     用于playbook搜索Ansible roles;

host_key_checking = False                             检查远程主机密钥;

#sudo_exe = sudo                                      sudo远程执行命令;

#sudo_flags = -H                                              传递sudo之外的参数;

timeout = 10                                                    SSH超时时间;

remote_user = root                                  远程登陆用户名;

log_path = /var/log/ansible.log                日志文件存放路径;

module_name = command                             Ansible命令执行默认的模块;

#executable = /bin/sh                             执行的Shell环境,用户Shell模块;

#hash_behaviour = replace                             特定的优先级覆盖变量;

#jinja2_extensions                              允许开启Jinja2拓展模块;

#private_key_file = /path/to/file             私钥文件存储位置;

#display_skipped_hosts = True                       显示任何跳过任务的状态;

#system_warnings = True                               禁用系统运行ansible潜在问题警告;

#deprecation_warnings = True                          Playbook输出禁用“不建议使用”警告;

#command_warnings = False                       command模块Ansible默认发出警告;

#nocolor = 1                                                  输出带上颜色区别,开启/关闭:0/1;

pipelining = False                                             开启pipe SSH通道优化;

[accelerate]                                                      accelerate缓存加速。

accelerate_port = 5099

accelerate_timeout = 30

accelerate_connect_timeout = 5.0

accelerate_daemon_timeout = 30

accelerate_multi_key = yes

 

 

5.1基础配置

编辑ansible的主机配置文件hosts,添加主机组client

cp /etc/ansible/hosts{,.bak}

cat > /etc/ansible/hosts<<EOF

[client]

192.168.24.131

192.168.24.132

192.168.24.133

EOF
[root@test1 ~]# tail  /etc/ansible/hosts

[client]

192.168.24.131

192.168.24.132

192.168.24.133


 

 

5.2批量运行命令

ansible client -a "uptime"

等于

ansible client -m command -a “uptime”



ansible -vvv -a “hostname”显示执行过程

-m 指定模块

-a 后面执行命令

##注:如果执行管道,-m 指定shell模块

【主要参数如下】

-v,–verbose                                      打印详细模式;

-i PATH,–inventory=PATH                       指定host文件路径;

-f NUM,–forks=NUM                             指定fork开启同步进程的个数,默认5;

-m NAME,–module-name=NAME           指定module名称,默认模块command;

-a MODULE_ARGS                       module模块的参数或者命令;

-k,–ask-pass                           输入远程被管理端密码;

–sudo                               基于sudo用户执行;

-K,–ask-sudo-pass                      提示输入sudo密码与sudo一起使用;

-u USERNAME,–user=USERNAME         指定移动端的执行用户;

-C,–check                            测试执行过程,不改变真实内容,相当于预演;

-T TIMEOUT,                                           执行命令超时时间,默认为10秒;

--version                                                  查看Ansible软件版本信息。

ansible-playbook --syntax-check user.yml #验证yml语法

[root@jenkins script]# ansible-playbook --syntax-check user.yml
[DEPRECATION WARNING]: ACCELERATE_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_DAEMON_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_CONNECT_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_MULTI_KEY option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_PORT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
 [WARNING]: Could not match supplied host pattern, ignoring: test


playbook: user.yml #正常语法

5.3 批量发送文件

copy 模块

src=从哪里来

dest=到哪里去

mode=修改权限

backup=备份

 

本地的/root/1.txt 发送到所有的服务器的/opt下

ansible client -m copy -a "src=/root/1.txt dest=/opt/"

##注:src指从哪里来,dest指到哪里去

            新文件是黄色的,再次执行是绿色的

 

ansible client -a "ls -l /opt"     ##验证文件是否存在

 

ansible client -m copy -a "src=/root/1.txt dest=/opt/test/test1/" 

##自动在opt下创建/test/test1文件,并将1.txt复制到/test/tes1/目录下

 

ansible client -m copy -a "src=/root/1.txt dest=/opt/2.txt"     ##拷贝且修改文件名

 

ansible client -m copy -a "src=/root/3.txt dest=/opt/2.txt backup=yes" 

##3.txt会覆盖原2.txt,但在此之前会备份2.txt

 

ansible client -m copy -a "src=/root/4.txt dest=/opt/5.txt owner=test group=test mode=0755"

##修改所有者和文件权限

 

 

 

shell 模块

运行脚本、命令、特殊符号



创建文件

echo 'yum -y install lrzsz' >/opt/yum.sh



1.先把脚本发送到对应的服务器

ansible client -m copy -a "src=/opt/yum.sh dest=/opt/ mode=755"

ansible client -a "ls -l /opt/yum.sh"



2、运行 /bin/sh

ansible client -m shell -a "/bin/sh /opt/yum.sh"

ansible client -m shell -a "rpm -qa| grep lrzsz"    ##shell支持特殊符号

 

script 脚本模块

1.把脚本发送到对应服务器(过程不显示)

2.运行脚本 (过程不显示)



写一个脚本 更改所有服务器的yum源

cat>/opt/yuan.sh<<EOF

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

EOF



ansible client -m script -a "/opt/yuan.sh"

ansible client -a "yum repolist"

cron 定时任务模块

每5分钟显示hello到/tmp/test.log

echo '*/5 * * * * echo hello >>/tmp/test.log 2>&1' >>/var/spool/cron/root ##原命令



crond模块

ansible client -m cron -a 'name=hello minute=*/2 job="echo hello >>/tmp/test.log 2>&1"' ##改造后命令

ansible client -a "crontab -l"

例:时间同步

[root@test1 ~]# ansible client -m cron -a 'name=date minute=*/5 job="/usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'

192.168.24.131 | CHANGED => {

    "changed": true,

    "envs": [],

    "jobs": [

        "date"

    ]

}

[root@test1 ~]# ansible client -a "crontab -l"

192.168.24.131 | CHANGED | rc=0 >>

#Ansible: date

*/5 * * * * /usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1

 

测试方法:

ansible all -a hostname

ansible -C 操作之前检查语法,模拟一下命令不会生效,无误之后可以去掉-C

 

##添加定时任务:

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present" -C

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present"

ansible -a "crontab -l"

##删除这个定时任务

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent" -C

ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent"

ansible -a "crontab -l"

 

1.真正运行ansible生效前 检查语法

ansible -C

2.没问题就去掉-C

 

 

 

yum 模块:

ansible client -m yum -a "name=vim state=installed"

ansible client -m yum -a "name=lrzsz,net-tool" ##yum安装多个软件

 

file模块:

ansible client -m file -a "dest=/tmp/test/ state=directory"  ##创建远程目录

ansible client -a "tree -F /tmp/" 

owner 设置复制传输后的数据属主信息

group 设置复制传输后的数据属组信息

mode  设置文件数据权限信息

dest  要创建的文件或目录命令,以及路径信息

src   指定要创建软连接的文件信息

 

 

六、模块:

 

6.1 ansible如何查询帮助,查询模块的参数

ansible-doc -s copy     ##查看copy模块帮助

ansible-doc -l ##显示所有模块

 

 

 

 

七、通过ansible批量管理服务

1、命令行 各种模块

2、书写剧本-playbook

 

ansible部署rsync,nfs,sersync(实践)

 


 

 

八、基础补充--ansible-playbook

 

8.1特点:

1.配置管理

2.批量部署

3.ad-hoc 批量执行命令

ansible client -m command -a "hostname"

4.编写playbook剧本-脚本

 

8.2核心功能:

1.pyYAML-剧本语言

2.paramiko-远程连接与数据传输

3.jinjia2--ansible模板

 

 

8.3准备环境:

1.四台机器web01 backup nfs01 m01

2.配置好m01与web01 backup nfs的ssh密钥认证

3.配置好m01通过ansible管理web01 backup nfs01

 

 

 

8.4写法步骤:

核心:找谁干啥

 

 

ansible语言是yml,严格要求对齐,注意空格

-host:all  ##哪台服务器

  task:    ##做什么任务,运行什么模块

      - command:ifconfig  

等于

ansible -m command -a "ifconfig"

ansible -m shell -a "echo hello >>/tmp/hello.log"

vim /op/show.yml

---

- hosts: all

  tasks:

    - command: ifconfig

ansible-playbook /op/show.yml -C 运行

[root@test1 ~]# cat /opt/show.yml

---

- hosts: client ##-空格

  tasks:   ##两个空格

    - command: uptime  ##四个空格-空格

---

- hosts: client

  tasks:

    - shell: ifconfig >/tmp/new.txt

---

- hosts: client

  tasks:

    - name: "show is addr"

      shell: ifconfig >/tmp/new.txt

给所有服务器添加定时任务--变为剧本

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

 

删除定时任务:

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=absent

 

多个任务:

---

- hosts: client

  tasks:

    - name: network restart

      cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

    - name: ipaddr

      shell: ifconfig

 

不同机器运行不同命令:

---

- hosts: 192.168.24.131

  tasks:

    - name: ipaddr

      shell: ifconfig

      

- hosts: 192.168.24.132

  tasks:

    - name: network

       cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present

 

yum 安装:

---     

- hosts: all

  tasks:

    - name: yum install

       yum: name=htop,sl,cowsay

批量修改单个用户:

---
- hosts: client
  gather_facts: false
  tasks:
    - name: Change password
      user: name={{ name1 }}  password={{ chpass | password_hash('sha512') }}  update_password=always
ansible-playbook play1.yml -e "name1=username chpass=admin#123" #name1是用户名,chpass后面填新密码,把用户和密码传参进去(适合修改单个用户)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章