Ansible基础

Ansible基础

    • 概述
    • 配置文件
    • 四种交互方式
    • Ansible 工具集
    • ssh-key验证
    • 常用命令
      • ansible
        • ping模块
        • command模块
        • shell模块
        • script模块
        • copy模块
        • fetch模块
        • file模块
        • unarchive模块
        • archive模块
        • hostname模块
        • cron模块
        • yum模块
        • service模块
        • user模块
        • group模块
        • lineinfile模块
        • replace模块
        • setup模块
      • ansible-doc
      • ansible-galaxy
      • ansible-pull
      • ansible-playbook
      • ansible-vault
      • ansible-console

概述

  ​Ansible用 SSH 协议管理机器,通过python脚本来实现的,所以管理机和托管机都需要安装python2.6以及更高的版本,除此之外被管理的机器不需要安装任何组件。因此,批量操作的环境是比较轻量的。

配置文件

/etc/ansible/ansible.cfg:主配置文件

# 禁用验证host_key_checking(建议开启)
host_key_checking=False 

# 定义库文件位置,脚本,或者存放可通信主机的目录
inventory = /etc/ansible/hosts

# ansible默认搜寻模块的位置 Ansible知道如何搜寻多个用冒号隔开的路径,同时也会搜索在playbook中的"./library"。
library = /usr/share/my_modules/

# 日志存放位置 默认不开启,ansible将会吧模块加载纪录在系统日志系统中.不包含用密码。(建议开启)
log_path=/var/log/ansible.log
 
# 默认是command模块。(建议参数改为shell)
module_name = command
 
# 默认ansible会为输出结果加上颜色。如果你想关闭这一功能,可以把nocolor设置为1。
nocolor=0

# 默认ansible可以调用一些cowsay的特性,使得/usr/bin/ansible-playbook运行起来更加愉快。如果不喜欢cows,可以通通过将nocows设置为1来禁用这一选项:
nocows=0
 
# 对于Ansible中的异步任务,这个是设置定义,当具体的poll interval没有定义时,多少时间回查一下这些任务的状态,默认值是一个折中选择15秒钟。
poll_interval=15
 
# 如果你是用pem密钥文件而不是SSH客户端或密钥认证的话, 你可以设置这里的默认值, 来避免每一次提醒设置密钥文件位置"--ansible-private-keyfile"
private_key_file=/path/to/file.pem
 
# 这个设置是你系统默认的远程SSH端口, 如果不指定,默认为22号端口:(建议修改成别的端口)
remote_port = 22
 
# 这是个ansible使用/usr/bin/ansible-playbook连接的默认用户名。注意如果不指定, /usr/bin/ansible默认使用当前用户名称:
remote_user = root
 
# 默认SSH链接尝试超时时间
timeout = 10

# 默认通信机制为smart。如果本地系统支持ControlPersist技术的话, 将会使用(基于OpenSSH)ssh, 如果不支持该技术,将使用paramiko库,其他传输选项包括local, chroot,jail等等。用户通常可以这个设置为smart,让playbook在需要的条件自己选择connectin参数
transport = smart

# 默认设置会记录并验证通过在用户hostfile中新发现的的主机(如果host_key_checking 被激活的话)。这个选项在有很多主机的时候将会性能很差。在这种情况下,建议使用SSH传输代替。当设置为False时, 性能将会提升,在host_key checking被禁用时候, 建议使用
record_host_keys=True
 
# 如果这个设置为True, scp将代替用来为远程主机传输文件
scp_if_ssh=False   
 
# 执行ansible模块来使用管道特性, 从而减少执行远程模块SSH操作次数。当使用sudo操作的时候, 必须在所有管理的主机的/etc/sudoers中禁用requiretty
pipelining=False
 
# 在急速模式下使用的端口。
accelerate_port = 5099

# 设置从客户机获取数据的超时时间。如果在这段时间内没有数据传输,套接字连接会被关闭。考虑到异步任务,超时时间应该大于2倍的poll_interval,默认值为30秒
accelerate_timeout = 30

# 设置套接字调用的超时时间。默认设置为1.0秒
accelerate_connect_timeout = 1.0
 
# 控制加速daemon守护进程的超时时间,单位分钟,默认为30分钟
accelerate_daemon_timeout = 30
 
# 设置将允许多个私钥被加载到daemon
accelerate_multi_key = yes

/etc/ansible/hosts:主机清单

# Ex 1: 未分组的主机,在任何组头之前指定。
green.example.com
blue.example.com
192.168.100.1
192.168.100.10

# Ex 2: webservers组
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
# 如果有多个主机遵循一种模式,则可以指定
www[001:006].example.com

# Ex 3: dbservers组中的数据库服务器集合
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
# 这是另一个主机范围的例子
db-[99:101]-node.example.com

/etc/ansible/roles:角色

/usr/share/ansible_plugins:插件

四种交互方式

Ansible基础_第1张图片

  • CMDB:CMDB 存储和管理者企业IT架构中的各项配置信息,是构建 ITIL 项目的核心工具,运维人员可以组合 CMDB 和 Ansible,通过 CMDB 直接下发指令调用Ansible 工具集完成操作者所希望达到的目标;
  • PUBLIC/PRIVATE 方式:Ansible 除了丰富的内置模块外,同时还提供丰富的 API语言接口,如PHP、Python、PERL 等多种流行语言,基于 PUBLIC/PRIVATE,Ansible 以 API 调用的方式运行;
  • Ad-Hoc 命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务;
  • Playbooks:Users 预先编写好 Ansible Playbooks,通过执行Playbooks 中预先编排好的任务集,按序执行任务;

Ansible 工具集

Ansible 工具集包含 Inventory、Modules、Plugins 和 API。

  • Inventory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;

  • Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;

  • Plugins:提供了各种附加功能,如连接类型插件、循环插件、变量插件、过滤插件等;

  • API:供第三方程序调用的应用程序编程接口,可以基于此做 Ansible的二次开发;

ssh-key验证

​ ansible基于ssh协议的,所以批量请求主机,需要验证登录信息。账号密码登录不安全,所以基于key验证是最佳解决方案。

# 生成密钥,本机会生成~/.ssh/id_rsa.pub,id_rsa两文件
ssh-keygen -t rsa -C "solt" -f ''/root/.ssh/id_rsa'
-t 指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2),默认是rsa
-C comment提供一个新注释,相当于加盐。
-f 指定生成文件名
以上参数都可以省略,ssh-keygen一直回车也行

# 将私钥copy给免密登录主机
ssh-copy-id -i 10.0.0.11

过程:

  • 执行完ssh-keygen命令后,会在~/.ssh/目录下生成两个文件,id_rsa(私钥)和id_rsa.pub(公钥)。

  • 执行完ssh-copy-id命令后,当输入yes的时候会在本地服务器上生成一个known_hosts文件,这个文件会把远程计算机的相关信息记录在这个文件里,确保你下次登录的时候是相同的服务器,避免遭受劫持。输入远端服务器的密码之后会在远端服务器生成一个authorized_keys,下次登录就不需要再次输入密码。

批量认证脚本,hosts.txt为主机列表

#!/bin/bash
USER=root
PASS=root
ssh-keygen  -f '/root/.ssh/id_rsa' -P '' &> /dev/null
rpm -q expect &> /dev/null || yum install -y -q expect

while read IP;do
expect <<EOF
set timeout 20
spawn ssh-copy-id  $USER@$IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASS\n" }
}
expect eof
EOF
done < hosts.txt

常用命令

以下是测试版本

ansible --version
ansible 2.9.18
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

ansible

参数:

-m 指定执行使用的模块。默认是command。
-u 指定远程主机以username运行命令。
-s 相当于linux系统下的sudo命令。
-C 只检查不实际执行。
-e 引用外部参数。
-f 处理主机数,可以理解成并发数,默认是5。
-i 即inventory指定清单列表, 默认/etc/ansible/hosts。
--list-host 可以简写成--list列出执行主机。

语法格式:ansible HOST-PATTERN [-m MOD_NAME] [-a MOD_ARGS]

HOST-PATTERN为主机清单。默认读取/etc/ansible/hosts配置。下面都以all来测试。

# 查询所有主机的hostname
ansible all -a "hostname"

ping模块

测试网络连通模块。如果连通返回pong

实例:

ansible all -m ping

command模块

执行命令模块。可以通过ansible-doc modul-ename查看,参数都差不多的后面不再赘述。

参数:

  • creates:一个文件名,当该文件存在,则该命令不执行
  • free_form:命令模块采用自由形式命令运行。没有名为“free form”的实际参数
  • chdir:在执行指令之前,先切换到该目录
  • removes:一个文件名,当该文件不存在,则该选项不执行

实例:

# 都可以查到redhat-release
ansible all -m command -a "cat /etc/redhat-release"
ansible all -m command -a "chdir=/etc cat redhat-release"
ansible all -m command -a "creates=/data cat /etc/redhat-release"
# skipped, since /data does not exist
ansible all -m command -a "removes=/data cat /etc/redhat-release"

shell模块

万能模块。相比于command模块,支持管道、符号等。

实例:

ansible all -m shell -a "netstat -lntup | grep sshd"

script模块

脚本执行模块。可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。

实例:

ansible all -m script -a "hello.sh"

copy模块

复制文件(夹)模块。把ansible主机的文件或者文件夹copy到节点主机。类比sftp/ftp的put功能。

参数:

  • src:源文件路径。相对路径也支持。
  • content:直接生成文件内容。与src互斥。
  • dest:目标路径。
  • owner:指定用户。
  • group:指定权限组。
  • mode:权限,rwx。
  • backup:copy时备份。如果两个文件的MD5SUM值不一致才会备份。
  • force:强制copy,yes表示覆盖。no表示如果不存在同名文件,才会copy。
  • others:所有file模块的选项这里都可以使用

实例:

# 把文件夹/home/zhang复制到对端主机的/root目录下
ansible all -m copy -a "src=/home/zhang dest=/root"
# 如果不改变文件内容,备份不成功
ansible all -m copy -a "src=hello.sh dest=/home/zhang owner=zhang group=zhang mode=764 backup=yes"
# 如果hello.sh文件存在就不复制
ansible all -m copy -a "content=helloworld dest=/home/zhang/hello.sh force=no"

fetch模块

拉取文件模块。ansible主机拉取节点主机文件(不可以是文件夹)。类比sftp/ftp的get功能。

参数:

  • src:对端主机文件
  • dest:拉取文件的路径
  • validate_checksum:获取文件后,验证源和目标校验和是否匹配。
  • fail_on_missing:设置为“yes”时,如果由于任何原因无法读取远程文件,则任务将失败。在Ansible 2.5之前,将此设置为只有源文件丢失时才会失败。在Ansible 2.5中,默认值更改为“yes”。
  • flat:允许您覆盖将hostname/path/to/file附加到目标的默认行为。如果“dest”以“/”结尾,它将使用源文件的basename,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件。如果使用多个主机如果文件名相同,则会为每个主机覆盖该文件。

实例:

# test1文件夹会自动创建目录结构为dest_path/hostname/src_path/file
ansible all -m fetch -a "src=/root/.bashrc dest=/home/zhang/test1"
tree -a /home/zhang/test1/
/home/zhang/test1/
├── 10.0.0.11
│   └── root
│       └── .bashrc
└── 10.0.0.12
    └── root
        └── .bashrc

# flat=yes,支持重命名,且取消了/hostname/src_path/file目录结构,同时文件重名会覆盖
ansible all -m fetch -a "src=/root/.bashrc dest=/home/zhang/test2 flat=yes"
tree
.
└── test2

file模块

操作远程主机文件的模块。

参数:

  • force: 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项: yes|no
  • group: 定义文件/目录的属组
  • mode: 定义文件/目录的权限
  • owner: 定义文件/目录的属主
  • path: 必选项,定义操作文件/目录的路径
  • recurse: 递归的设置文件的属性,只对目录有效
  • src: 要被链接的源文件的路径,只应用于state=link的情况
  • dest: 被链接到的路径,只应用于state=link的情况
  • state: 表示file的状态, 主要分为:
    directory: 如果目录不存在,创建目录;
        file: 即使文件不存在,也不会被创建;
        link: 创建软链接;
        hard: 创建硬链接;
       touch: 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间;
       absent: 删除目录、文件或者取消链接文件;

实例:

# 创建一个文件
ansible all -m file -a "path=/home/zhang/test state=touch mode="600" owner=zhang group=zhang"
# 同名会修改
ansible all -m file -a "path=/home/zhang/test state=touch mode="u+rwx,g-wx,o-rwx" owner=zhang group=zhang"
# 创建一个目录,如果和文件同名不能创建
ansible all -m file -a "path=/home/zhang/test state=directory mode="770" owner=zhang group=zhang"
# 删除一个文件或者文件夹
ansible all -m file -a "path=/etc/redhat-release state=absent"
ansible all -m file -a "path=/home/zhang/test2 state=absent"
# 创建软连接
ansible all -m file -a "state=link src=/etc/centos-release dest=/etc/redhat-release"

unarchive模块

打包模块。支持zip,tar,tar.gz

参数:

  • copy: 在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
  • creates: 指定一个文件名,当该文件存在时,则解压指令不执行
  • dest: 远程主机上的一个路径,即文件解压的绝对路径。 必须是一个目录路径!
  • list_files: 如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项;
  • src: 如果copy为yes,则需要指定压缩文件的源路径;
  • mode: 解压后文件的权限;
  • owner: 解压后文件或目录的属主;
  • group: 解压后的目录或文件的属组;

实例

# ansible主控机的src目录,解压到远端主机的dest主机
ansible all -m unarchive -a "src=/test/test.tar.gz dest=/test"
# 远端主机的src目录,解压到远端主机的dest目录
ansible all -m unarchive -a "src=/test/test.tar.gz dest=/test remote_src=yes"

archive模块

打包模块。

参数:

  • path:压缩的源目录(远端主机)
  • dest:压缩的目标目录(远端主机)
  • owner: 压缩后文件或目录的属主;
  • group: 压缩后的目录或文件的属组;
  • mode:压缩后的文件权限;
  • format:压缩后的格式

实例:

# 将远端主机的path
ansible all -m archive -a "path=/test dest=/root/txt.tar.bz2 format=bz2 owner=zhang group=zhang"

hostname模块

修改主机名模块。

参数:

  • name:要修改的hostname
  • use:更新主机名的策略。如果不设置,我们尝试自动检测,但这可能是有问题的,特别是与容器,因为它们可能呈现误导性信息,默认是null。(选项: generic, debian, sles, redhat, alpine, systemd, openrc, openbsd, solaris, freebsd)。也就是说,如果需要修改docker的hostname的时候,最好带上use参数。
ansible 10.0.0.11 -m hostname -a "name=web01"

cron模块

定时任务模块。

参数:

  • name:job任务名,作为cron模块修改的标识。
  • job:job执行脚本位置
  • cron_file:指定一个新的文件来替代/etc/cron.d下的文件。
  • other:对应crontab时间参数,有:minute,hour,day,month,weekday
  • disabled:是否禁用,默认是不启用的。disabled=yes,其实是注释 /var/spool/cron/root的某一个任务。特别注意:如果启用的时候没有带时间参数,默认是*
  • state:状态,默认present,state=absent,表示删除

实例:

# mysql备份脚本
cat mysql_bak.sh
mysqldump -A -F --sing-transaction --master-data=2 -q -uroot | gzip /data/sql_bak/mysql_`date+%F%T`.sql.gz
# 创建定时任务
ansible 10.0.0.11 -m cron -a "hour=2 minute=30 weekday=1-5 name=mysql_backup job=/root/script/mysql_bak.sh"
# 禁用
ansible 10.0.0.11 -m cron -a "name=mysql_backup job=/root/script/mysql_bak.sh disabled=yes"
# 启用
ansible 10.0.0.11 -m cron -a "hour=2 minute=30 weekday=1-5 name=mysql_backup job=/root/script/mysql_bak.sh disabled=no"
# 删除
ansible 10.0.0.11 -m cron -a "name=mysql_backup state=absent"

yum模块

安装模块。

参数:

  • config_file:yum的配置文件
  • disable_gpg_check:关闭gpg_check
  • disablerepo:不启用某个源
  • enablerepo:启用某个源
  • name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
  • state:表示是安装还是卸载的状态, 其中present、installed、latest 表示安装, absent 、removed表示卸载删除; present默认状态, laster表示安装最新版本

实例:

ansible all -m yum -a "name=httpd state=present"
ansible all -m yum -a "name=httpd state=absent"

service模块

服务模块。

参数:

  • name: 服务名称
  • state: started/stopped/restarted/reloaded
  • enabled: true/false
  • runlevel: 运行级别
  • sleep: 如果执行了restarted,在stop和start之间沉睡几秒
  • arguments: 给命令行提供一些选项

实例:

# 启动httpd并设为开机自启
ansible all -m service -a "name=httpd state=started enabled=true"

user模块

用户相关模块。请求的是useradd, userdel, usermod三个指令

参数:

  • name:指定用户名
  • password: 设用户密码,会修改/etc/shadow文件,需要加密echo “123456”| openssl passwd -1 -stdin
  • update_password: 修改用户密码, 其中always: 新密码和旧密码不同时进行修改; on_create: 为新创建的用户指定密码,默认选项
  • home:指定家目录,默认/home/username
  • remove:删除家目录,等价于userdel -r
  • group:指定用户组,默认username
  • state:默认为present,表示添加用户; absent表示删除用户
# 添加用户
ansible all -m user -a 'name=zhang2 password=$1$wHl9tWMC$VisPeVNkyUyKZ0ei40Hay. group=zhang'
# 修改密码
ansible all -m user -a 'name=zhang2 update_password=always password=$1$wHl9tWMC$VisPeVNkyUyKZ0ei40Hay.'
# 删除用户
ansible all -m user -a "name=zhang2 remove=yes state=absent"

group模块

用户组相关模块。请求的是groupadd, groupdel, groupmod 三个指令

参数:

  • gid: 指定用的gid
  • name: 指定用户名
  • state: 是创建还是删除, (present,absent)
  • system: 如果是,则表示创建的组是系统组

实例:

# 添加用户组
ansible all -m group -a 'name=zhang state=present'
# 删除用户组
ansible all -m group -a 'name=zhang state=absent'

lineinfile模块

文件编辑模块。和sed功能类似

参数:

  • path: 指定要修改的文件。 regexp:匹配要修改的内容;line:要增加或者修改的内容

  • state: 默认present增加,absent为删除

  • backup:yes为备份

  • insertafter:匹配到的行的最后一行的后面添加一行

  • insertbefore: 匹配到的行的最后一行的前面添加一行

实例:

# path为源文件,regexp为匹配规则,line为修改内容
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=.*' line='SELINUX=disabled'"
# 删除注释前备份
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^#' backup=yes state=absent"

replace模块

和lineinfile类似。

实例:

# 把lineinfile的line换成replace
ansible all -m replace -a "path=/etc/selinux/config regexp='^SELINUX=.*' replace='SELINUX=disabled'"

setup模块

查看主机信息模块。

实例:

# 查看所有信息
ansible 10.0.0.11 -m setup
# 过滤键为ansible_nodename的项,也就是查看主机名
ansible 10.0.0.11 -m setup -a "filter=ansible_nodename"

ansible-doc

帮助命令。

实例:

# 查看完整帮助文档
ansible-doc setup
# 查看概述文档
ansible-doc -s setup

ansible-galaxy

  从https://galaxy.ansible.com/下载roles。角色是ansible实现的一套完整的实践方案,可以也理解一堆playbook的集合,可以共享。假如,有个需求需要安装redis,我们需要考虑到被控端主机的操作系统类型,比如,Ubuntu和CentOS的安装工具不一样,这个是需要提前考虑的。这个时候,我们可以从ansible-galaxy上来观摩一下别人的实践方案。

# 下载
ansible-galaxy install davidwittman.redis
# 列出下载的roles
ansible-galaxy list
# 删除
ansible-galaxy remove davidwittman.redis

ansible-pull

  ​该指令使用需要谈到Ansible的另一种工作模式:pull 模式(Ansible默认使用push模式)。这和通常使用的push模式工作机理刚好相反,其适用于以下场景:

  • (1)你有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;
  • (2)你要在刚启动的没有网络连接的主机上运行Anisble。

Ansible-pull命令使用格式如下:
ansible-pull [options] [playbook.yml]

通过Ansible-pull结合git和crontab一并实现,其原理如下:通过crontab定期拉取指定的Git 版本到本地, 并以指定模式自动运行预先制订好的指令。

具体示例参考如下:

*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1

Ansible-pull通常在大批量机器场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术和前瞻性规划有较高要求。

ansible-playbook

参数:

  • –check or -C:只检测可能会发生的改变,但不真正执行操作
  • –list-hosts:列出运行任务的主机
  • –list-tags :列出playbook文件中定义所有的tags
  • –list-tasks:列出playbook文件中定义的所以任务集
  • –limit:主机列表 只针对主机列表中的某个主机或者某个组执行
  • -f :处理主机数,可以理解成并发数,默认是5。
  • -t :playbook中如果有定义tags,指定运行一个或者多个tags
  • -v :显示过程 -vv -vvv更详细

ansible-vault

加密解密工具

参数:

  • decrypt:解密
  • encrypt:加密
  • edit:编辑加密文件
  • rekey:修改口令
  • create:创建一个新文件

例子:

ansible-vault encrypt hello.yml
ansible-vault decrypt hello.yml

ansible-console

​ 交互式终端工具。ansible-console进入交互模式,Ctrl+D或Ctrl+C即可退出当前终端。ansible-console命令在实际工作中用于Ad-Hoc和Ansible-playbooks之间的场景,常用于集中一批临时操作或命令,使用Ad-Hoc要键入很多次但整体操作的复杂度又不至于使用Playbooks时,这时ansible-console是最佳选择。

语法:

  • cd:切换主机组
  • list:列出当前主机组的ip
  • forks n:设置并发数
  • help:查看内置命令

实例:

cd web
yum name=httpd state=present
service name=httpd state=started
service name=httpd state=stopped

参考:

ansible简介:https://blog.51cto.com/14156658/2461907

ansible模块:https://www.cnblogs.com/kevingrace/p/7553179.html

ansible-pull :http://www.linuxmysql.com/25/2017/370.htm

你可能感兴趣的:(工具)