运维自动化就是将日常重复性的工作通过规则设定使其遵循预先既定规则,在指定的范围时间内自动化运行,但整个过程无需人工参与

Ansible是近年越来越火的一款运维自动化工具,其主要功能是帮忙运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率,常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等。它丰富的内置模块(如acl、command、shell、cron、yum、copy、file、user等,多达569个)和开放的API接口,同时任何遵循GPL协议的企业或个人都可以随意修改和发布自己的版本。

在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移;Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,这点非常诱人

从自动化工作类型角度归类如下:
(1)应用部署:Ansible内置网络、应用、系统、第三方云平台扩展等完善的功能模块,协助运维快速完成应用的安装、卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。
(2)配置管理:配置管理(Configuration Management, CM)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。配置管理的目标是记录软件产品的演化过程,确保软件开发者在软件生命周期中各个阶段都能得到精确的产品配置。在日益复杂的IT环境和用户需求下,Ansible内置File、Template,结合Jinja、Lineinfile等内置模块,同时无缝结合GitHub、GitLab、Git、SVN、Jenkins等主流版本控制和CI持续集成工具,助力配置管理自动化。
(3)任务流编排:有效保证Tasks任务流按既定规则和顺序完成事先制订的目标和计划,同时Roles编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目的可架构性和规范性,协助控制项目维护成本不致过高。

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:
(1)ad-hoc模式使用单个模块,支持批量执行单条命令。
(2)playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

等幂性是指如果系统已经处于期望的状态,则对系统什么也不操作。而收敛性是指系统不需要变更或操作的特性。

无需agent,安装便捷。模块可定制,剧本集功能强大

大规模(超过200台)执行速度较慢
对接方式只有SSH一种,对windows支持一般

安装: yum install ansible -y
ansible --version

Ansible的命令主要有六个:ansible、ansible-doc、ansible-galaxy、ansible-playbook、ansible-pull以及ansible-vault。

获取所有文件存放目录:rpm -ql ansible
查看所有模块信息:ansible-doc -l

解决问题1:The authenticity of host '' can't be established
修改ansible.cfg的#host_key_checking= False取消注释

解决报错2:Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh-keygen一路回车,主要是用来免密通信的
ssh-copy-id 192.168.0.103 需要输入对应主节的root密码就可以了

测试命令:ansible webservers -m ping

ansible的命令行使用
shell、copy、systemd等
ansible [pattern] -i hosts
pattern:匹配执行的ansible节点、组名、主机名、all、多个组或主机用逗号合并
-i hosts: 指定hosts 默认指定为/etc/ansible/hosts
-m:指定模块
-a: 设置模块参数,如copy src dest
ansible nodes -i hosts -m shell -a "ls /root"
ansible nodes -i hosts -m copy -a "src=hosts dest=/root/hosts"
ansible nodes -i hosts -m file -a "path=/root/hosts state=absent"
ansible nodes -i hosts -m copy -a "src=hosts dest=/root/hosts" --diff --check
上传前监测一下对比的差异,未真正的上传

shell模块:执行shell命令
ansible demo -m shell -a 'hostname' -o
demo为主机组,-m指定要使用的模块,-a指定模块的参数,-o将返回的结果已行作为每一台主机的单位显示

command模块的作用与shell类似,都是在被管主机上执行命令。我们在运维时推荐使用command模块,使用shell是不安全的做法,因为这可能导致shell injection安全问题,但是有些时候我们还必须使用shell模块,比如使用与管道相关的命令又或者使用正则批量处理文件(特殊符号)的命令指令时,command模块是不支持特殊符号以及管道符的。
ansible demo -m command -a 'mkdir /home/user/same/app -p'

copy模块基本是对文件的操作,比如复制文件。用于复制Ansible管理端的文件到远程主机的指定位置。
ansible demo -m copy -a "src=QR.png dest=/home/app"

script模块用于本地脚本在被管理远程服务器主机上面执行。大概流程是这样的:Ansible会将脚本复制到被管理的主机,一般情况下是复制到远端主机的/root/.ansible/tmp目录下,然后自动赋予可执行的权限,执行完毕后会自动将脚本删除。
ansible demo -m script -a "/home/user/echo.sh"

剧本集playbook:ansbile-playbook是一系列Ansible命令的集合。该命令在运行时将加载一个任务清单文件
ansible absible-playbook mysql.yml

---
# restart mysql service
- hosts: cloud
  remote_user: root
  tasks:
  - name: 重启mysql服务
    service: name=mysql state=restarted

定义变量,有4种方式:
(1)通过命令行传递变量(不常用)
ansible-playbook hi.yml -e "user=root"
(2)在inventory中定义变量
[webservers:vars]
ntp_server=ntp.example.com
(3)在playbook中定义变量
-hosts: demo
vars:
http_port: 80
(4)从角色和文件包含中定义变量
http_port: 80
https_port: 443

使用变量:
(1)在模板中使用变量
this dir is {{ install_dir}}
(2)在playbook中使用变量
template: src=/root/data/redis.conf dest={{ remote_install_path }}/redis.conf
vars: app_path: "{{ base_path }}/22"

条件选择when
shell: echo "i am os"
when: ansible_os_family == "RedHat" and ......

循环:with_items
(1)标准循环
taske:

  • shell: echo "{{ item }}"
    with_items:
  • one
  • two

    (2)哈希表循环

    username: demo1
    place: beijing
    username: demo2
    place: hebei

tasks:

  • name: read username as well as place
  • debug: msg="User {{ item.key }} is {{ item.value.username }} ({{ item.value.place }})"
  • with_dict: "{{users}}"
    (3)文件列表循环
    tasks:
  • file: dest=/data/www state=directory
  • copy: src={{item}} dest=/data/www/ owner=www
    with_fileglob:
  • /home/user/www/*

    (4)并行数据集收集循环

    softwares: ['apache', 'mysql']
    versions: [2, 5]

tasks:
-debug: msg="the {{item.0}} version is {{item.1}}
with_together:

  • "{{softwares}}"
  • "{{versions}}"

(5)整数循环
tasks:
-file: dest=/app/www/{{item}} state=directory
with_sequence: start=8000 end=8010 stride=1
(6) do-until循环

-host:nodes
 gather_facts:false
 tasks:
   -name: upload host file
    copy:
      src:hosts
      dest:/root/hosts
   -name: run command on remote hosts
     shell:pwd
     args:
        chdir:/tmp
        creates:/root/hosts
   -name:debug a message
     debug:
        msg:"hello"

ansible-playbook -i hosts test.yml

剧本集:
1、变量:register 多种方式
2、判断:when
3、循环:with_items、with_loops
4、delegate_to

......
vars:
hello:xiaoli
tasks:
-name:debug hello
debug:
msg:"{{hello}}"
-name:run command on remote hosts
shell:*
register:shell_out
failed_when: false
-name:set variable
set_fact:
hello:"{{shell_out.stdout}}"
when:
-shell_out.rc==0
-name:upload hosts file
copy:

src:"/root/{{item}}"
dest:"/root/{{item}}"

with_items:

- hosts
- hosts2

模块:
1、inventory

10.0.0.0 ansible_ssh_pass='123456'
10.0.0.1 ansible_ssh_pass='123456'
[docker]
10.0.0.1[1:3]
[dockers:vars]
ansible_ssh_pass='123456'
[ansible:children]
docker

Inventory文件一般用来定义远端主机的认证信息,比如SSH登录密码、用户名以及key相关信息,也支持主机或者主机组的便利定义。
对于多个inventory列表,修改了ansible.cfg文件中inventory的值,这里不再指向一个文件,而是指向一个目录。 inventory=/root/inventory/
对于动态inventory,动态Inventory就是Ansible所有的Inventory文件里面的主机列表和变量信息都支持从外部拉取。比如我们可以从CMDB系统和Zabbix监控系统拉取所有的主机信息,然后使用Ansible进行管理。
inventory内置参数
image.png

Ansible命令都是并发执行的,我们可以针对目标主机执行任何命令。默认的并发数目由ansible.cfg中的forks值来控制。当然,也可以在运行Ansible命令的时候通过-f指定并发数。也可以使用Ansible的异步执行功能来执行(-P 0的情况下会直接返回job_id,然后针对主机根据job_id查询执行结果)。
ansible webservers -m shell -a 'hostname' -f 5 -o

2、copy复制文件
ansible webservers -m copy -a 'src=hosts.py dest=/root/'

3、用户管理
首先通过openssl命令来生成一个密码,因为ansible user的password参数需要接受加密后的值
echo ansible - openssl passwd -1-stdin
使用user模块批量新建用户
ansible192.168.1.2 -m user -a 'name=test password="$1$fcpQxeGv$VErvNXelrmLxprVIZC/DS1"' -f 5 -o
再通过ssh 192.168.1.1 -l test验证是否可以登录。

4、get_url模块:从远程主机下载指定url到本地
$ansible 192.168.1.2 -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

5、cron模块:定时执行
$ansible 192.168.1.2 -m cron -a "name='crontab test' minute=0 hour=5,2 job='ls -alh > /dev/null'"

6、facts组件
facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息
ansible 10.0.0.0 -m setup查看facts信息
ansible 10.0.0.1 -m setup -a 'filter=ansible'查看过滤信息

7、role:采用role的方式管理playbook,对我们日常使用的playbook的目录结构进行一些规范.


stray
129 声望10 粉丝