Ansible介绍

Ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,本身没有批量部署能力,真正具有批量部署的是Ansible所运行的模块Ansible只是提供一种框架

Ansible不需要在远程主机上安装Client/Agents,因为它们是基于SSH来和远程主机通讯的,Ansible目前已经已经被红帽官方收购

Ansible官网

Ansible架构

Ansible介绍和部署 - 图1

  • Ansible:核心程序
  • Core Modules:Ansible自带的模块
  • Custom Modules:核心模块功能不足时,用户可以添加扩展模块
  • Plugins:完成模块功能的补充,通过插件来实现记录日志,发送邮件或其他功能
  • Playbooks:剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
  • Connectior Plugins:负责和被监控端实现通信,默认是使用SSH
  • Host Inventory:记录由Ansible管理的主机信息,包括端口、密码、IP等

Ansible特点

  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
  • 默认使用SSH协议对设备进行管理
  • 有大量常规运维操作模块,可实现日常绝大部分操作
  • 配置简单、功能强大、扩展性强
  • 支持API及自定义模块,可通过Python轻松扩展
  • 通过Playbooks来定制强大的配置、状态管理
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
  • 具有幂等性,一种操作重复多次执行结果相同

Ansible命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组
  3. 加载自己对应的模块文件,如command
  4. 通过Ansible将模块或命令生成对应的临时Python文件(Python脚本),并将该文件传输至远程服务器
  5. 对应执行远程服务器用户的家目录的.ansible/tmp/XXX/XXX.PY文件
  6. 远程服务器给文件 +x 执行权限
  7. 远程服务器执行并返回结果
  8. 远程服务器删除临时Python文件sleep 0退出

安装部署Ansible

  • 安装Ansible
  1. [root@server1 ~]# yum install epel-release.noarch -y
  2. [root@server1 ~]# yum install -y ansible
  • 配置免密登录
  1. [root@server1 ~]# ssh-keygen
  2. # 一直按回车
  3. [root@server1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.31.20
  4. # 输入登录root@192.168.31.20的密码
  5. [root@server1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.31.30
  6. # 输入登录root@192.168.31.20的密码
  7. # 尝试是否可以免密登录
  8. [root@server1 ~]# ssh root@192.168.31.20
  9. [root@server1 ~]# ssh root@192.168.31.30
  • 配置主机清单文件/etc/ansible/hosts,将192.168.31.20和192.168.31.30加入到主机清单中
  1. [root@server1 ~]# vim /etc/ansible/hosts
  2. # 在最后一行添加如下内容
  3. [linuxservers]
  4. 192.168.31.20
  5. 192.168.31.30

Ansible常用命令

  • ansible:临时命令执行工具,常用于执行临时命令

      1. # 参数说明
      2. -a MODULE_ARGS:指定模块的参数
      3. -m MODULE_NAME:指定模块
      4. -C:坚持执行结果
      5. -e EXTRA_VARS:指明变量名
      6. -f FORKS:指定并发进程数
      7. -i INVENTORY:指定主机清单文件
      8. --syntax-check:检查执行命令是否存在语法错误
  • ansible-doc:常用于模块功能的查询

  • ansible-playbook:用于执行剧本

常见配置文件

  • /etc/ansible/ansible.cfg:主配置文件
  • /etc/ansible/hosts:主机清单文件
  • /etc/ansible/roles:角色目录
  1. [defaults]
  2. # some basic default values...
  3. #inventory = /etc/ansible/hosts # 定义主机清单文件
  4. #library = /usr/share/my_modules/ # 库文件的存放位置
  5. #module_utils = /usr/share/my_module_utils/
  6. #remote_tmp = ~/.ansible/tmp #生成的临时py文件在远程主机的目录
  7. #local_tmp = ~/.ansible/tmp #生成的临时py文件在本地主机的目录
  8. #plugin_filters_cfg = /etc/ansible/plugin_filters.yml
  9. #forks = 5 # 默认的并发数
  10. #poll_interval = 15 # 默认的线程池
  11. #sudo_user = root # 默认的sudo用户
  12. #ask_sudo_pass = True
  13. #ask_pass = True
  14. #transport = smart
  15. #remote_port = 22
  16. #module_lang = C
  17. #module_set_locale = False

常用模块

  1. ansible-doc -s 模块名 # 查看模块帮助
  2. ansible-doc -l # 查询ansible所有的模块

官方文档:Ansible Documentation — Ansible Documentation

Ansible的执行状态

  • 绿色:执行成功并且不需要做改变的操作

  • 黄色:执行成功并且对目标主机做变更

  • 红色:执行失败

  • 粉色:警告信息

  • 蓝色:显示ansible命令执行的过程

ping

  1. [root@server1 ~]# ansible -m ping linuxservers

Ansible介绍和部署 - 图2

group

参数名称

  1. gid # 设置组的GID号
  2. name # 管理组的名称
  3. state # 指定组状态,默认为创建,设置值为absent为删除
  4. system # 设置值为yes,表示为创建系统组
  • 添加系统组,指定gid与名称
  1. [root@server1 ~]# ansible -m group -a "name=zhangsan gid=111 system=yes" linuxservers

Ansible介绍和部署 - 图3

  • 删除组
  1. [root@server1 ~]# ansible -m group -a "name=zhangsan gid=111 state=absent" linuxservers

Ansible介绍和部署 - 图4

user

参数名称

  1. comment # 用户的描述信息
  2. createhom # 是否创建家目录
  3. force # 在使用'state=absent'时,行为与`userdel --force'一致.
  4. group # 指定基本组
  5. groups # 指定附加组,如果指定为('groups=')表示删除所有组
  6. home # 指定用户家目录
  7. name # 指定用户名
  8. password # 指定用户密码
  9. remove # 在使用 `state=absent'时, 行为是与 `userdel --remove'一致.
  10. shell # 指定默认shell
  11. state # 设置帐号状态,不指定为创建,指定值为absent表示删除
  12. system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
  13. uid # 指定用户的uid
  14. update_password # 更新用户密码
  15. expires # 指明密码的过期时间
  • 添加系统用户,指定uid、家目录、主组及注释
  1. [root@server1 ~]# ansible -m user -a "system=yes name=zhangsan home=/home/zhangsan uid=111 group=zhangsan comment='hello zhangsan'" linuxservers

如果不先新建指定的主组,那么就会报错,报错如下所示,为红色:

Ansible介绍和部署 - 图5

如果新建过了指定的主组,就会成功添加

Ansible介绍和部署 - 图6

  1. [root@server2 ~]# cat /etc/passwd | grep zhangsan
  2. zhangsan:x:111:111:hello zhangsan:/home/zhangsan:/bin/bash
  3. [root@server3 ~]# cat /etc/passwd | grep zhangsan
  4. zhangsan:x:111:111:hello zhangsan:/home/zhangsan:/bin/bash
  • 删除用户及家目录
  1. [root@server1 ~]# ansible -m user -a "name=zhangsan state=absent remove=yes" linuxservers

command

不需要-m指定模块,以及默认指定为command

不支持管道符,变量以及重定向等操作

  1. [root@server1 ~]# ansible -a "echo 'hello world'" linuxservers

Ansible介绍和部署 - 图7

shell

参数说明

  1. free_form # 指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form
  2. chdir # 指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
  3. creates # 使用此参数指定远程主机一个文件,当指定的文件存在时,就不执行对应命令
  4. removes # 使用此参数指定远程主机一个文件,当指定的文件不存在时,就不执行对应命令
  5. executable # 指定某种类型的 shell 去执行对应的命令,默认为/bin/sh
  • 与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 程序处理,支持重定向等操作
  1. [root@server1 ~]# ansible -m shell -a "echo 'hello world' > 1.txt" linuxservers
  2. [root@server2 ~]# cat 1.txt
  3. hello world
  4. [root@server3 ~]# cat 1.txt
  5. hello world

shell虽说是万能的模块但是某些复杂的操作也会使shell模块失效,这个时候就需要将操作写入到脚本中,使用scripts模块

script

参数说明

  1. free_form # 指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form
  2. chdir # 指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
  3. creates # 使用此参数指定远程主机一个文件,当指定的文件存在时,就不执行对应命令
  4. removes # 使用此参数指定远程主机一个文件,当指定的文件不存在时,就不执行对应命令

192.168.31.30的root目录下有1.txt,192.168.31.20的root目录下没有1.txt

  1. [root@server1 ~]# vim test.sh
  2. #!/bin/bash
  3. echo "hello linux" > 1.txt
  4. [root@server2 ~]# cat 1.txt
  5. hello world
  6. [root@server2 ~]# rm -f 1.txt
  7. [root@server3 ~]# cat 1.txt
  8. hello world
  9. [root@server1 ~]# ansible -m script -a "test.sh chdir=/root creates=1.txt" linuxservers

Ansible介绍和部署 - 图8

  1. [root@server2 ~]# cat 1.txt
  2. hello linux
  3. [root@server3 ~]# cat 1.txt
  4. hello world

copy

参数说明

  1. backup # 在覆盖之前,将源文件备份,备份文件包含时间信息。
  2. content # 用于替代“src”,可以直接设定指定文件的值
  3. dest # 必选项,要将源文件复制到的远程主机的绝对路径
  4. src # 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制
  5. directory_mode # 递归设定目录的权限,默认为系统默认权限
  6. force # 强制覆盖目的文件内容,默认为yes
  7. others # 所有的file模块里的选项都可以在这里使用

基本语句

  1. ansible -m copy -a "src=/本地文件 dest=/远程文件" linuxservers
  • 在创建文件时修改文件的属主和属组信息
  1. [root@server1 ~]# ansible -m copy -a "src=/root/test.sh dest=/root/test1 owner=user01 group=usergroup" linuxservers
  2. [root@server2 ~]# ll | grep test1
  3. -rw-r--r-- 1 user01 usergroup 39 3 3 23:31 test1
  4. [root@server3 ~]# ll | grep test1
  5. -rw-r--r-- 1 user01 usergroup 39 3 3 23:31 test1
  • 在传输文件时修改文件的权限信息,并且备份远程主机文件
  1. [root@server2 ~]# ll | grep test1
  2. -rw-r--r-- 1 root root 0 3 3 23:38 test1
  3. [root@server1 ~]# ansible -m copy -a "src=/root/test.sh dest=/root/test1.sh backup=yes mode=1777" 192.168.31.20
  4. [root@server2 ~]# ll | grep test1
  5. -rwxrwxrwt 1 root root 39 3 3 23:38 test1
  6. -rw-r--r-- 1 root root 0 3 3 23:38 test1.9221.2022-03-03@23:38:20~

Ansible介绍和部署 - 图9

  • 创建一个文件并直接编辑文件
  1. [root@server1 ~]# ansible -m copy -a "content='hello world' dest=/root/test1 backup=yes" 192.168.31.30
  2. [root@server3 ~]# cat test1
  3. hello world

file

参数说明

  1. name #
  2. force # 需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
  3. group # 定义文件/目录的属组
  4. mode # 定义文件/目录的权限
  5. owner # 定义文件/目录的属主
  6. path # 必选项,定义文件/目录的路径
  7. recurse # 递归设置文件的属性,只对目录有效
  8. src # 被链接的源文件路径,只应用于state=link的情况
  9. dest # 被链接到的路径,只应用于state=link的情况
  10. state= # 后面可加下面的参数
  11. absent # 删除文件
  12. directory # 如果目录不存在,就创建目录
  13. file # 验证文件是否存在,即使文件不存在,也不会被创建
  14. link # 创建软链接
  15. hard # 创建硬链接
  16. touch # 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其后修改时间
  • 创建目录:名称为test,属主属组都为root,权限为644
  1. ansible -m file -a "path=/tmp/dir1 owner=root group=root mode=644 state=directory" linuxservers
  • 创建文件
  1. ansible -m file -a "path=/tmp/file1 owner=root group=root mode=644 state=file" linuxservers
  • 删除文件
  1. ansible -m file -a "path=/tmp/file1 state=absent" linuxservers
  • 创建软链接文件
  1. ansible -m file -a "src=/root/test1 dest=/root/test2 state=link" linuxservers
  • 创建硬链接文件
  1. ansible -m file -a "src=/root/test1 dest=/root/test3 state=hard" linuxservers

yum

参数说明

  1. conf_file # 设定远程yum安装时所依赖的配置文件,如果配置文件没有在默认的位置
  2. disable_gpg_check # 是否禁止GPG checking,只用于'present' or 'latest'
  3. disablerepo # 临时禁止使用yum库。 只用于安装或更新时
  4. enablerepo # 临时使用的yum库。只用于安装或更新时
  5. name # 所安装的包的名称
  6. state # present安装,latest安装最新版本,absent卸载软件
  7. update_cache # 强制更新yum的缓存
  • 安装httpd
  1. ansible -m yum -a "name=httpd state=latest" linuxservers

安装过程中查看server2的进程

Ansible介绍和部署 - 图10

  • 卸载httpd
  1. ansible -m yum -a "name=httpd state=absent" linuxservers

service

参数说明

  1. arguments # 命令行提供额外的参数
  2. enabled # 设置开机启动,可以设置为yes或者no
  3. name # 服务名称
  4. runlevel # 开机启动的级别,一般不用指定
  5. sleep # 在重启服务的过程中,是否等待,如在服务关闭以后等待2秒再启动
  6. state # started启动服务,stopped停止服务,restarted重启服务,reloaded重载配置
  • 启动httpd服务
  1. ansible -m service -a "name=httpd state=started" linuxservers

selinux

功能:管理远端主机的 SELINUX 防火墙

参数说明

  1. state # SELinux模式:enforcing、permissive、disabled
  2. policy # SELinux使用的策略名,比如:targeted
  • 设置SELinux为enforcing
  1. ansible -m selinux -a "state=enforcing policy=targeted" linuxservers
  • 设置SELinux为disabled
  1. ansible -m selinux -a "state=disabled policy=targeted" linuxservers

setup

获取远程主机的详细信息

  1. ansible -m setup linuxservers