Ansible

Ansible是基于python语言开放,只需在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为Ansible是基于SSH 远程管理,而Linux 服务器大都离不开SSH,所以Ansible 不需要为配置工作添加额外的支持。

Ansible 安装使用非常简单,而且基于上千个插件和模块,实现各种软件、平台、版本的管理,支持虚拟容器多层级的部署。

Ansible 自动化运维管理工具优点:

  • 轻量级,更新时只需要在操作机上进行一次更新即可
  • 采用SSH协议
  • 不需要客户端安装agent
  • 批量任务执行可以写成脚本,而且不用分发到远程客户端
  • 使用python 编写,维护更简单
  • 支持sudo 普通用户命令
  • 去中心化管理

Ansible 安装配置

Ansible 可以工作在linux / BSD / Mac OS X等平台,对python 环境版本最低要求为python 2.6以上。安装之后默认主目录为 /etc/ansible/,其中hosts文件为被管理主机,ansible.cfg为ansible主配置文件,roles为角色或插件路径。

Ansible 安装

从Github获取Ansible

$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible

通过 pip 安装最新发布版本

$ sudo easy_install pip 
$ sudo pip install ansible

通过apt 安装(ubuntu)

sudo apt-get install ansible

如果提示资源问题,则执行以下命令

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

配置参数

ansible 默认配置文件为 /etc/ansible/ansible.cfg,配置文件中可以对Ansible进行各项参数的调整,包括并发线程、用户、模块路径、配置优化等。

ansible.cfg

  • [defaults]

日常可能用到的配置,这些多数保持默认即可。

[defaults]
inventory = /etc/ansible/hosts                                           #定义Inventory
library =  /usr/share/my_modules/                                   #自定义lib库存放目录 
remote_tmp = $HOME/.ansible/tmp                               #临时文件远程主机存放目录 
local_tmp  =  $HOME/.ansible/tmp                                #临时文件本地存放目录 
forks = 5                                                                        #默认开启的并发数 
poll_interval   =  15                                                       #默认轮询时间间隔 
sudo_user   =   root                                                      #默认sudo用户 
ask_sudo_pass = True                                               #是否需要sudo密码 
ask_pass = True                                                        #是否需要密码
roles_path   =  /etc/ansible/roles                                #默认下载的Roles存放的目录 
host_key_checking  = False                                     #首次连接是否需要检查key认证,建议设为False
timeout   =  10                                                          #默认超时时间
remote_user   =  root                                                         #如没有指定用户,默认使用的远程连接用户 
log_path =  /var/log/ansible.log                               #执行日志存放目录 
module_name  =  command                                  #默认执行的模块 
action_plugins =  /usr/share/ansible/plugins/action              #action插件的存放目录 
callback_plugins =  /usr/share/ansible/plugins/callback       #callback插件的存放目录 
connection_plugins  =  /usr/share/ansible/plugins/connection   #connection插件的存放目录 
lookup_plugins =  /usr/share/ansible/plugins/lookup       #lookup插件的存放目录 
vars_plugins  =  /usr/share/ansible/plugins/vars            #vars插件的存放目录 
filter_plugins  =  /usr/share/ansible/plugins/filter            #filter插件的存放目录 
test_plugins  =  /usr/share/ansible/plugins/test             #test插件的存放目录 
strategy_plugins  = /usr/share/ansible/plugins/strategy   #strategy插件的存放目录 
fact_caching  =  memory                           #getfact缓存的主机信息存放方式 
retry_files_enabled  = False                    
retry_files_save_path =  ~/.ansible-retry   #错误重启文件存放目录
  • [privilege_escalation]

出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置

become = True         #是否sudo
become_method=sudo   #sudo 方式 
become_user=root     #sudo后变为root用户 
become_ask_pass=False   #sudo后是否验证密码
  • [privilege_connection]

该配置不常用到

record_host_keys=False   #不记录新主机的key以提升效率
pty=False        #禁用sudo功能
  • [ssh_connection]

Ansible默认使用的是SSH协议进行与对端主机进行通信。但配置项较少,多数默认即可

pipelining = False
  • [accelerate]

Ansible连接加速相关配置。多数保持默认即可

accelerate_port  =  5099          #加速连接端口
accelerate_timeout  =  30        #命令执行超时时间,单位秒
accelerate_connect_timeout = 5.0   #连接超时时间,单位秒
accelerate_multi_key  =  yes    
  • [selinux]

关于selinux的相关配置几乎不会涉及,保持默认配置即可

libvirt_lxc_noseclabel  =  yes
libvirt_lxc_noseclabel  =  yes 
  • [colors]

Ansible对于输出结果的颜色也进行了详尽的定义且可配置,保持默认即可

highlight  =  white
verbose  =  blue
warn   =  bright purple
error  =   red
debug  =  dark  gray
deprecate  =  purple
skip  =  cyan
unrechable  =  red
ok    =  green
changed  =  yellow
diff_add  =  green 
diff_remove  =  red
diff_lines   =  cyan

Inventory文件(hosts)

ansible_ssh_host
# 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port
# ssh端口号.如果不是默认的端口号,通过此变量设置.

ansible_ssh_user
# 默认的 ssh 用户名

ansible_ssh_pass
# ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass
# sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
# sudo 命令路径(适用于1.8及以上版本)

ansible_connection
# 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
# ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type
# 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.

ansible_python_interpreter
# 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如  \*BSD, 或者 /usr/bin/python
# 不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).

# 与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

ansible常用模块

ansible的简单使用方式

ansible -i /etc/ansible/hosts 主机或主机组 -m 指定模块 -a 命令

-i:指定配置文件位置,不指定默认去/etc/ansible/hosts 里找 
-m:指定操作模块,后跟模块名 
-a:发布,后面跟命令

主机连通性

使用ansible web -m ping命令来进行主机连通性测试

ansible web -m ping
# 其中web为host组

command模块

直接在远程主机上执行命令,并将结果返回本主机。

ansible web -m command -a 'ss -ntl'

shell模块

可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

ansible web -m shell -a 'cat /etc/passwd |grep "keer"'

copy模块

用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。

  • 复制文件
ansible web -m copy -a 'src=~/hello dest=/data/hello'
  • 给定内容生成文件,并制定权限
ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'
  • 覆盖
ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'

file模块

用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。

force  #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group  #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner  #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse  #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest  #被链接到的路径,只应用于state=link的情况
state  #状态,有以下选项:

    directory: #如果目录不存在,就创建目录
    file: #即使文件不存在,也不会被创建
    link: #创建软链接
    hard: #创建硬链接
    touch: #如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    absent: #删除目录、文件或者取消链接文件
  • 创建目录
ansible web -m file -a 'path=/data/app state=directory'
  • 创建链接文件
ansible web -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link'
  • 删除文件
ansible web -m file -a 'path=/data/a state=absent'

fetch模块

用于从远程某主机获取(复制)文件到本地。

dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
ansible web -m fetch -a "src=/app/f1 dest=/app/"

cron模块

管理cron计划任务;-a “”: 设置管理节点生成定时任务

action: 
cron backup=   #如果设置,创建一个crontab备份 【yes|no】
cron_file=    #如果指定, 使用这个文件cron.d,而不是单个用户
crontab
  day=     #日应该运行的工作( 1-31, *, */2, )
  hour=   # 小时 ( 0-23, *, */2, )
  minute=    #分钟( 0-59, *, */2, )
  month=     #月( 1-12, *, /2, )
  weekday   # 周 ( 0-6 for Sunday-Saturday,, )
  job=       #指明运行的命令是什么
  name=   #定时任务描述
  reboot    # 任务在重启时运行,不建议使用,建议使用special_time
  special_time   #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
  state   #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
  user    #以哪个用户的身份执行
ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F'"

删除计划任务

ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F' state=absent" 

yum模块

包管理

conf_file    #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check   #是否禁止GPG checking,只用于`present‘ or `latest’。
disablerepo   #临时禁止使用yum库。 只用于安装或更新时。
enablerepo   #临时使用的yum库。只用于安装或更新时。
name=    #所安装的包的名称
state=     #present安装, latest安装最新的, absent 卸载软件。
update_cache    #强制更新yum的缓存。
ansible web -m yum -a "name=dstat state=present disable_gpg_check=yes"
ansible web -m yum -a "name=dstat state=absent"

service模块

服务程序管理

arguments   #命令行提供额外的参数
enabled   #设置开机启动。
name=     #服务名称
runlevel    #开机启动的级别,一般不用指定。
sleep    #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state     #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
开启远程被控制端的nginx 服务
ansible web -m service -a "name=nginx state=started"
关闭远程的nginx 服务
ansible web -m service -a "name=nginx state=stopped"

user模块

用户模块,管理用户帐号

comment        # 用户的描述信息
createhome    # 是否创建家目录
force      # 在使用state=absent是, 行为与userdel -force一致.
group     # 指定基本组
groups   # 指定附加组,如果指定为(groups=)表示删除所有组
home     # 指定用户家目录
move_home    # 如果设置为home=时, 试图将用户主目录移动到指定的目录
name     # 指定用户名
non_unique     # 该选项允许改变非唯一的用户ID值
password       # 指定用户密码,若指定的是明文密码,是不能用的,需用md5加密过后的密码
remove   # 在使用state=absent时, 行为是与userdel -remove一致
shell      # 指定默认shell
state      # 设置帐号状态,不指定为创建,指定值为absent表示删除
system  # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid     # 指定用户的uid
update_password    # 更新用户密码
创建用户along01,uid=1111,家目录在/app/along01 下
ansible web -m user -a 'name=along01 comment="along01 is along" uid=1111 group=along shell=/bin/bash home=/app/along01'
ansible web -m shell -a "cat /etc/passwd |grep along01" 查看
ansible web -m user -a "name=along01 state=absent" 删除用户

group模块

用户组模块,添加或删除组

gid         # 设置组的GID号
name=  # 管理组的名称
state     # 指定组状态,默认为创建,设置值为absent为删除
system  # 设置值为yes,表示为创建系统组
ansible web -m group -a 'name=tom state=present'

script模块

在指定节点运行服务端的脚本

ansible web -m script -a '/app/test.sh' 在远程被控制的机器执行脚本

setup模块

查机器的所有facts信息

  • facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
  • facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
  • setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。
  • setup模块下经常使用的一个参数是filter 参数,查询的是全部信息,很多,filter 相当于匹配筛选。
ansible web -m setup -a "filter='*mem*'" 查看内存的信息

playbook模块

介绍

  • playbook是ansible用于配置,部署,和管理被控节点的剧本。
  • 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。
  • 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情

Ansible playbook使用场景

  • 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
  • 就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
  • 使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

playbook YAML 语法

  • YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)
  • YAML文件扩展名通常为.yaml或者.yml。下面为示例
  • 一定要对齐,只能使用空格
实例
# 初始化服务器
---
- hosts: init-server
  user: root
  tasks:
    - name: playbook_test
      shell: touch /tmp/playbook.txt
  • hosts: 指定了对哪些主机进行参作;
  • user: 指定了使用什么用户登录远程主机操作;
  • tasks: 指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。

playbook 核心组件

  • tasks:任务
  • variables:变量
  • templates:模板
  • handlers:处理器
  • roles:角色
实例

jdk.yml

# 安装jdk
---
- hosts: engine
  remote_user: engine
  gather_facts: yes
  become: yes
  become_user: root
  become_method: sudo
  roles:
    - jdk

roles/jdk/tasks/main.yml

# 安装openjdk至远程服务器
---
- name: 安装openjdk
  apt: name=openjdk-8-jdk update_cache=yes state=present
  when: ansible_os_family == "Debian"

- name: 安装openjdk
  yum: name=java-1.8.0-openjdk-devel.x86_64 state=present
  when: ansible_os_family == "RedHat"

  • name: 对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
  • gather_facts: 指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
  • vars: 指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
  • apt/yum: 提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
  • when: 条件判断,一般用于针对不同版本的系统,比如对centos、ubuntu 等系统进行不同的操作命令。

playbook handlers

当我们执行 tasks 后,服务器发生变化之后我们要执行一些操作。比如我们修改了某个服务的配置文件,需要重启下服务。

---
- name: handlers test
  hosts: testhost
  user: root
  tasks:
    - name: test copy
      copy: src=/etc/passwd dest=/tmp/handlers.txt
      notify: test handlers
  handlers:
     - name: test handlers
     shell: echo "www.huangt.com" >> /tmp/handlers.txt

说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。也就是说如果 src 和 dest 内容是一样的,并不会去执行 handlers 里面的 shell 相关命令。所以这种比较适合配置文件发生更改后,需要重启服务的操作。

附录

Linux常用命令

  • ssh-keygen
$ssh-keygen -t rsa -C "huangt" -f aliyun.key

$vim /etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes

PermitRootLogin no //禁止root登录
PasswordAuthentication yes //允许密码登录,根据你的情况设置
文章作者: 子新
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Subnew
devops ansible
喜欢就支持一下吧