Ansible

506 阅读12分钟

ansible简介

Ansible是一个IT自动化工具。它可以配置系统,开发软件,或者编排高级的IT任务,例如持续开发或者零宕机滚动更新。Ansible的主要目标是简单易用。它也同样专注安全性和可靠性,最小化的移动部件,使用Openssh传输(有加速socket模式和同样可用拉取模式)

Ansible 管理机器使用无代理的方式,更新远端服务进程或者因为服务未安装导致的问题在 Ansible 里面从来不会发生。Ansible 是非中心化的,它依赖于现有的操作系统凭证来访问控制远程机器

ansible安装

通过yum安装最新版本

yum install epel* && yum install ansible

通过源码安装

yum install git
git clone git://github.com/ansible/ansible.git --recursive
source ./hacking/env-setup
sudo easy_install pip
pip install paramiko PyYAML Jinja2 httplib2 six
# 更新版本时,不仅更新ansible源码树,还要更新git中指向ansible自身模块的submodules
# git pull --rebase
# git submodule update --init --recursive
# 一旦运行env-setup,意味着ansible已从源码中运行起来。默认的inventory文件是 /etc/ansible/hosts.inventory文件也可以另行指定
ansible 127.0.0.1 -w ping --ask-pass

Ansible配置文件

获取最新配置文件

如果使用程序包管理器安装ansible,最新的 ansible.cfg 配置文件有可能出现在 /etc/ansible 下并且命名为 ”.rpmnew”, 也可能根据不同的更新命名为其它名称

如果你是通过 pip 或者其他方式安装,则可能需要自行创建这个文件,以免原配置文件被覆盖.Ansible 的默认设置将会将其覆盖

[root@Proxy tmp]# rpm -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts

环境配置

Ansible 通过环境变量的形式来进行配置.在Ansible中几乎所有配置都可以通过Ansible的Playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照以下优先级查找配置文件

  • ANSIBLE_CONFIG: 首先Ansible命令会检查环境变量,及这个环境变量指向的配置文件
  • ./ansible.cfg: 其次将会检查当前目录下的ansible.cfg配置文件
  • ~/.ansible.cfg: 检查当前用户目录下的.ansible.cfg配置文件
  • /etc/ansible/ansible.cfg: 最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件

大多数的Ansible参数可以通过设置带有 ANSIBLE_ 开头的环境变量进行配置,参数名称必须都是大写字母,如下配置: export ANSIBLE_SUDO_USER=root 设置了环境变量之后, ANSIBLE_SUDO_USER 就可以在后续操作中直接引用

配置文件不同段详解

配置文件被切割成了不同段.多数配置选项位于“general”段

defaults

action_plugins

“行为”是 ansible中的一段代码,用来激活一些事件,例如执行一个模块,一个模版,等等

这是一个以开发者为中心的特性,使得一些底层模块可以从外部不同地方加载:

action_plugins = ~/.ansible/plugins/action_plugins/:/usr/share/ansible_plugins/action_plugins
ansible_managed

Ansible-managed 是一个字符串.可以插入到Ansible配置模版系统生成的文件中.如果你使用以下的自字符:

{{ ansible_managed }}

默认设置可以哪个用户修改和修改时间:

ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}

这个设置可以告知用户,Ansible修改了一个文件,并且手动写入的内容可能已经被覆盖.

需要注意的是,如果使用这一特性,这个字符串中将包含一个日期注释,如果日期更新,模版系统将会在每一次报告文件修改.

ask_pass

这个可以控制,Ansible 剧本playbook 是否会自动默认弹出弹出密码.默认为no::

ask_pass=True

如果使用SSH 密钥匙做身份认证.可能需要修改这一参数

ask_sudo_pass

类似 ask_pass,用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no:

ask_sudo_pass=True

如果用户使用的系统平台开启了sudo 密码的话,应该开绿这一参数

inventory

这个是默认库文件位置,脚本,或者存放可通信主机的目录:

inventory = /etc/ansible/hosts
library

这个是Ansible默认搜寻模块的位置:

library = /usr/share/ansible
log_path

如果出现在ansible.cfg文件中.Ansible将会在选定的位置登陆执行信息.请留意用户运行的Ansible对于logfile有权限:

log_path=/var/log/ansible.log

这个特性不是默认开启的.如果不设置,ansible将会吧模块加载纪录在系统日志系统中.不包含用密码

forks

这个选项设置在与主机通信时的默认并行进程数 _forks=5

module_lang

这是默认模块和系统之间通信的计算机语言,默认为’C’语言.

module_name

这个是/usr/bin/ansible的默认模块名(-m). 默认是’command’模块. 之前提到过,command模块不支持shell变量,管道,配额. 所以也许你希望把这个参数改为’shell’:

module_name = shell
nocolor

默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.如果你想关闭这一功能,可以把’nocolor’设置为‘1’:

nocolor=0
pattern

如果没有提供“hosts”节点,这是playbook要通信的默认主机组.默认值是对所有主机通信,如果不想被惊吓到,最好还是设置个个选项:

hosts=*

注意 /usr/bin/ansible 一直需要一个host pattern,并且不使用这个选项.这个选项只作用于/usr/bin/ansible-playbook

private_key_file

如果你是用pem密钥文件而不是SSH 客户端或秘密啊认证的话,你可以设置这里的默认值,来避免每一次提醒设置密钥文件位置–ansible-private-keyfile:

private_key_file=/path/to/file.pem
remote_port

这个设置是你系统默认的远程SSH端口,如果不指定,默认为22号端口:

remote_port = 22
remote_tmp

Ansible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.在有些场景下,你也许想使用默认路径希望像更换补丁一样使用, 这时候你可以使用这个选项.:

remote_tmp = $HOME/.ansible/tmp

默认路径是在用户家目录下属的目录.Ansible 会在这个目录中使用一个随机的文件夹名称.

remote_user

这是个ansible使用/usr/bin/ansible-playbook链接的默认用户名. 注意如果不指定,/usr/bin/ansible默认使用当前用户名称:

remote_user = root
timeout

这个是默认SSH链接尝试超市时间:

timeout = 10

更多详细配置文件点此了解

Ansible简单使用

ansible1.3及以后的版本,默认会在本地的openssh可用时尝试用其远程通信,这会启用ControlPersist(一个性能特性),Kerberos和在~/.ssh/config中的配置选项。然而当你使用Redhat6系列时,其openssl可能过于老旧导致无法支持ControlPersist。Ansible会采用paramiko(由Python实现的高质量OpenSSH库)

在Ansible 1.2 及之前的版本,默认将会使用 paramiko. 本地OpenSSH必须通过-c ssh 或者 在配置文件中设定

你偶尔会遇到不支持sftp的设备,可以通过在配置文件中切换到scp模式与之连接

Ansible命令参数

参考链接

Option:
    -a module_args:                 指定执行模块时的参数
    -B num:                         后台运行超时时间,异步运行,表示任务最多运行多少秒
    -C:                             模拟执行,不会真正在机器上执行
    -D:                             当更新的文件数内容较少时,显示这些文件不同的地方,与-C搭配使用效果较好
    -e:                             执行命令添加额外参数变量
    -f num:                         指定开启的进程数,默认为5
    -i:                             指定要读取的inventory文件路径
    -l:                             限定执行的主机访问
    --list-hosts:                   列出执行的主机,但并不会执行
    -m moudename:                   指定模块名称,默认为comment
    -M:                            指定模块路径
    -o:                             尝试在一行上输出
    --output:                       输出到文件
    -P POLL_Inventory:              表示多长时间返回一次状态,需要-B。
    --syntax-check:                 检测playbook的语法书写
    -t:                             将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上
    -v:                             输出详细执行信息
    --version:                      显示版本信息

Connection option:
    -k:                             输入远程主机秘钥
    --private-key:                 使用此文件来验证连接
    --key-file:                    使用此文件来验证连接
    -u:                             指定远程主机执行用户
    -c:                             指定连接方式,paramiko (SSH)、ssh、locallocal方式常用于crontab和kickstarts,默认是smart
    -T:                             ssh连接超时时间
    --sftp-extra-args=:             指定给scp/ssh/sftp传递的参数

Privilege Escalation Options:
    -s:                             在远程机使用sudo运行操作
    -S:                             类似于su
    --ask-sudo-pass:                输入sudo密码
    --ask-su-pass:                  输入su密码

开始第一条命令

现在你已经安装了Ansible,是时候从一些基本知识开始了. 编辑/etc/ansible/hosts 并在其中加入一个或多个远程系统.你的public SSH key必须在这些系统的authorized_keys

[root@Proxy ~]# echo "192.168.198.15[0:1]" >> /etc/ansible/hosts

[root@Proxy ~]# ansible server -m shell -a "free" --ask-pass
SSH password: 
192.168.198.151 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:        1000304      206916      348008        7252      445380      626720
Swap:       2097148           0     2097148
192.168.198.150 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:        1000304      306352      205640       57288      488312      440308
Swap:       2097148       69408     2027740

ansible inventory文件

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为

   /etc/ansible/hosts

除默认文件外,你还可以同时使用多个 inventory 文件(后面会讲到),也可以从动态源,或云上拉取 inventory 配置信息.详见 动态 Inventory.

参数说明

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_ruby_interpreter
      与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

例子

some_host         ansible_ssh_port=2222     ansible_ssh_user=manager
aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host      ansible_python_interpreter=/usr/local/bin/python
ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

主机与组

erp.jd.com

[webserver]
www.jd.com
mail.jd.com
192.168.1.1

[dbserver]
db1.jd.com
db2.jd.com

# []中是组名,便于对系统进行分类。一个系统可以属于多个组
# 如果有主机的ssh端口不是标准的22,用冒号分隔
# 192.168.198.151:222
# SSH 配置文件中列出的端口号不会在 paramiko 连接中使用,会在 openssh 连接中使用

主机别名

# 假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下

peng ansible_ssh_port=22 ansible_ssh_host=192.168.198.150

[root@Proxy ~]# ansible server -m shell -a "free" --ask-pass
SSH password: 
peng | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:        1000304      306440      205476       57288      488388      440244
Swap:       2097148       69408     2027740
192.168.198.151 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:        1000304      206952      347912        7252      445440      626636
Swap:       2097148           0     2097148
# 在这个例子中,通过 “jumper” 别名,会连接 192.168.1.50:5555.记住,这是通过 inventory 文件的特性功能设置的变量. 
# 一般而言,这不是设置变量(描述你的系统策略的变量)的最好方式.后面会说到这个问题.

批量添加

# 假设你有顺序50台机器需要加入,可简写为如下:
[server]
192.168.198.15[0:50]
# 同样一组相似的hostname也可以顺序:
db[a:z].jd.com

对于每一个host,还可以选择连接类型和连接用户名:
[server]
localhost ansible_connection=local
192.168.198.151 ansible_connection=ssh ansible_ssh_user=peng
192.168.198.150 ansible_connection=ssh ansible_ssh_user=root

主机变量

分配变量给主机很容易做到,这些变量定义后可在 playbooks 中使用:

[server]
192.168.198.150 http_port=80 maxRequestsPerChild=808
192.168.198.151 http_port=8080 maxRequestsPerChild=909

组变量

[server]
192.168.198.150

[server:vars]
ntp_server=time.windows.com

附加组

可以把一个组作为另一个组的子成员,以及分配变量给整个组使用. 这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用:

[nginx]
192.168.198.150

[db]
192.168.198.151

[server:children]
nginx
db

[server:vars]
ntp_server=time.windows.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2

[usa:children]
southeast
northeast
southwest
northwest

分文件定义host和group变量

在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联. 不同于 inventory 文件(INI 格式),这些独立文件的格式为 YAML

假设 inventory 文件的路径为:

/etc/ansible/hosts举例来说,假设你有一些主机,属于不同的数据中心,并依次进行划分.每一个数据中心使用一些不同的服务器.比如 ntp 服务器, database 服务器等等. 那么 ‘raleigh’ 这个组的组变量定义在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能类似这样:

---
ntp_server: acme.example.org
database_server: storage.example.org

假设有一个主机名为 ‘foosball’, 主机同时属于两个组,一个是 ‘raleigh’, 另一个是 ‘webservers’. 那么以下配置文件(YAML 格式)中的变量可以为 ‘foosball’ 主机所用.依次为 ‘raleigh’ 的组变量,’webservers’ 的组变量,’foosball’ 的主机变量:

/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

举例来说,假设你有一些主机,属于不同的数据中心,并依次进行划分.每一个数据中心使用一些不同的服务器.比如 ntp 服务器, database 服务器等等. 那么 ‘raleigh’ 这个组的组变量定义在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能类似这样:

---
ntp_server: acme.example.org
database_server: storage.example.org

这些定义变量的文件不是一定要存在,因为这是可选的特性.

还有更进一步的运用,你可以为一个主机,或一个组,创建一个目录,目录名就是主机名或组名.目录中的可以创建多个文件, 文件中的变量都会被读取为主机或组的变量.如下 ‘raleigh’ 组对应于 /etc/ansible/group_vars/raleigh/ 目录,其下有两个文件 db_settings 和 cluster_settings, 其中分别设置不同的变量:

/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings

‘raleigh’ 组下的所有主机,都可以使用 ‘raleigh’ 组的变量.当变量变得太多时,分文件定义变量更方便我们进行管理和组织. 还有一个方式也可参考,详见 Ansible Vault 关于组变量的部分. 注意,分文件定义变量的方式只适用于 Ansible 1.4 及以上版本.

Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目录可放在 inventory 目录下,或是 playbook 目录下. 如果两个目录下都存在,那么 playbook 目录下的配置会覆盖 inventory 目录的配置.

把你的 inventory 文件 和 变量 放入 git repo 中,以便跟踪他们的更新,这是一种非常推荐的方式

Patterns

在Ansible中,Patterns 意思就是与哪台主机进行交互.但是在playbooks 中它指的是对应主机应用特定的配置或执行特定进程

我们再来复习下:doc:intro_adhoc 章节中介绍的命令用法,命令格式如下:

ansible <pattern_goes_here> -m <module_name> -a

示例如下:

ansible webservers -m service -a "name=httpd state=restarted"

一个pattern通常关联到一系列组(主机的集合) –如上示例中,所有的主机均在 “webservers” 组中.

不管怎么样,在使用Ansible前,我们需事先告诉Ansible哪台机器将被执行. 能这样做的前提是需要预先定义唯一的 host names 或者 主机组.

所有主机:

all
*

单主机或组

如下patterns分别表示一个或多个groups.多组之间以冒号分隔表示或的关系.这意味着一个主机可以同时存在多个组:

webservers
webservers:dbservers

目标属于A组,但不属于B组

你也可以排队一个特定组,如下实例中,所有执行命令的机器必须隶属 webservers 组但同时不在 phoenix组:

webservers:!phoenix

目标同时属于A,B两组

你也可以指定两个组的交集,如下实例表示,执行命令有机器需要同时隶属于 webservers 和 staging 组.

webservers:\&staging

目标A,B组中属于C组但不属于D组

你也可以组合更复杂的条件:

webservers:dbservers:\&staging:!phoenix
表示“‘webservers’ 和 ‘dbservers’ 两个组中隶属于 ‘staging’ 组并且不属于 ‘phoenix’ 组的机器才执行命令

传递参数指定group

你也可以使用变量如果你希望通过传参指定group,ansible-playbook通过 “-e” 参数可以实现,但这种用法不常用:

webservers:!{{excluded}}:&{{required}}

通配符*

你也可以不必严格定义groups,单个的host names, IPs , groups都支持通配符:

*.example.com
*.com

通配符与组混搭

  • Ansible同时也支持通配和groups的混合使用: one*.com:dbservers
  • 在高级语法中,你也可以在group中选择对应编号的server: webservers[0]
  • 或者一个group中的一部分servers: webservers[0-25]
  • 大部分人都在patterns应用正则表达式,但你可以.只需要以 ‘~’ 开头即可: ~\(web\|db\).*\.example\.com

Ad-hoc

所谓 ad-hoc 命令是什么呢?

(这其实是一个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令行敲入shell命令和 写shell scripts两者之间的关系)...

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令.

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务.

一般而言,在学习了 playbooks 之后,你才能体会到 Ansible 真正的强大之处在哪里.

那我们会在什么情境下去使用ad-hoc 命令呢?

比如说因为圣诞节要来了,想要把所有实验室的电源关闭,我们只需要执行一行命令 就可以达成这个任务,而不需要写 playbook 来做这个任务.

至于说做配置管理或部署这种事,还是要借助 playbook 来完成,即使用 ‘/usr/bin/ansible-playbook’ 这个命令.

在下面的例子中,我们将演示如何使用 /usr/bin/ansible 运行 ad hoc 任务.

Parallelism and Shell Commands

现在执行如下命令,这个命令中,atlanta是一个组,这个组里面有很多服务器,”/sbin/reboot”命令会在atlanta组下 的所有机器上执行.这里ssh-agent会fork出10个子进程(bash),以并行的方式执行reboot命令.如前所说“每次重启10个” 即是以这种方式实现:

ansible server -m shell -a "reboot" -f 1

在执行 /usr/bin/ansible 时,默认是以当前用户的身份去执行这个命令.如果想以指定的用户执行 /usr/bin/ansible, 请添加 “-u username”选项,如下:

ansible server -m shell -a 'free' -f 1 -u peng

如果想通过 sudo 去执行命令,如下:

ansible atlanta -a "free" -u peng --sudo [--ask-sudo-pass]

如果你不是以 passwordless 的模式执行 sudo,应加上 --ask-sudo-pass (-K)选项,加上之后会提示你输入 密码.使用 passwordless 模式的 sudo, 更容易实现自动化,但不要求一定要使用 passwordless sudo.

也可以通过–sudo-user (-U)选项,使用 sudo 切换到其它用户身份,而不是 root(译者注:下面命令中好像写掉了–sudo):

ansible atlanta -a "/usr/bin/foo" -u username -U otheruser [--ask-sudo-pass]

在有些比较罕见的情况下,一些用户会受到安全规则的限制,使用 sudo 切换时只能运行指定的命令.这与 ansible的 no-bootstrapping 思想相悖,而且 ansible 有几百个模块,在这种限制下无法进行正常的工作. 所以执行 ansible 命令时,应使用一个没有受到这种限制的账号来执行.One way of doing this without sharing access to unauthorized users would be gating Ansible with Ansible Tower, which can hold on to an SSH credential and let members of certain organizations use it on their behalf without having direct access

以上是关于 ansible 的基础.如果你还没阅读过 patterns 和 groups,应先阅读 Patterns .

在前面写出的命令中, -f 10 选项表示使用10个并行的进程.这个选项也可以在 Ansible的配置文件 中设置, 在配置文件中指定的话,就不用在命令行中写出了.这个选项的默认值是 5,是比较小的.如果同时操作的主机数比较多的话, 可以调整到一个更大的值,只要不超出你系统的承受范围就没问题.如果主机数大于设置的并发进程数,Ansible会自行协调, 花得时间会更长一点.

ansible有许多模块,默认是 ‘command’,也就是命令模块,我们可以通过 -m 选项来指定不同的模块.在前面所示的例子中, 因为我们是要在 Atlanta 组下的服务器中执行 reboot 命令,所以就不需要显示的用这个选项指定 ‘command’ 模块,使用 默认设定就OK了.一会在其他例子中,我们会使用 -m 运行其他的模块

command 模块不支持 shell 变量,也不支持管道等 shell 相关的东西.如果你想使用 shell相关的这些东西, 请使用’shell’ 模块.两个模块之前的差别请参考

shell

Ansible可以执行shell命令,与command模块区别在于可以使用管道。

常用参数

  • chdir: 在运行命令之前进入此目录
  • creates: 如果指定的文件存在则执行命令,如果不存在则忽略
  • removes: 如果指定的文件不存在则执行命令,如果存在则忽略

    [root@Proxy tmp]# ansible server -m shell -a 'echo $HOSTNAME'   # 单引号引用远程机变量
    192.168.198.151 | CHANGED | rc=0 >>
    Slave
    192.168.198.150 | CHANGED | rc=0 >>
    Master
    [root@Proxy tmp]# ansible server -m shell -a "echo $HOSTNAME"   # 双引号引用Ansible机变量
    192.168.198.151 | CHANGED | rc=0 >>
    Proxy
    192.168.198.150 | CHANGED | rc=0 >>
    Proxy

copy

以并行的方式同时以SCP大量的文件推送到多台机器。

常用参数

  • src: 指定需要copy的文件或目录(Ansible的路径)
  • dest: 指定被拷贝到远程主机的目录
  • content: 当不使用sec时,可使用conteng直接指定文件内容,src和content二选一
  • force: 若远程主机已存在同名文件,并且与ansible文件内容不同时,是否强制覆盖,默认为yes
  • backup: 若远程主机已存在同名文件,并且与ansible文件内容不同时,是否备份文件,yes会主动备份
  • group: 文件拷贝到远程主机后的属组,若远程用户属组不存在,则默认为root
  • owner: 文件拷贝到远程主机的属主,若远程用户属主不存在,则默认为root
  • mode: 文件拷贝到远程主机的权限,可指定u+x或0644,644这样

ansible server -m copy -a 'src=~/.ssh/authorized_keys dest=~/.ssh/'

192.168.198.150 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
}, 
"changed": true, 
"checksum": "7c42aab96a477aeb596cb7b0c37130512742d182", 
"dest": "/tmp/authorized_keys", 
"gid": 0, 
"group": "root", 
"md5sum": "eaae6e7246aea78d88ab931572309eb5", 
"mode": "0755", 
"owner": "peng", 
"size": 392, 
"src": "/root/.ansible/tmp/ansible-tmp-1587955355.22-187385668346121/source", 
"state": "file", 
"uid": 1000
}

cron

该模块适用于管理cron计划任务

常用参数

  • minute: 设定计划任务的分定位值,默认为*
  • hour: 设定计划任务的时定位值,默认为*
  • day: 设定计划任务的日定位值,默认为*
  • month: 设定计划任务的月定位置,默认为*
  • weekday: 设定计划任务的周定位置,默认为*
  • user: 设定计划任务的属主用户,默认为管理员用户
  • job: 设定计划任务的执行脚本或命令,比如“echo ok”
  • name: 设定计划任务的名称,计划任务名称会在注释中显示
  • state: 当计划任务有名称时,根据名称修改或删除任务,[present(修改),absent(删除)]
  • disabled: 当计划任务有名称时,禁用掉计划任务,yes禁用,no启用
  • backup: 当修改或删除对应的计划任务时,在远程主机的/tmp下创建备份文件,以crontab开头随机加入一些字符。推荐设定为yes

[root@Proxy tmp]# ansible server -m cron -a 'name="cron_test" minute=*/5  job="echo $(date)>>/tmp/passwd" backup=yes'
192.168.198.150 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "/tmp/crontabZTNu0f", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "cron_test"
    ]
}
192.168.198.151 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "/tmp/crontabr4eP7y", 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "cron_test"
    ]
}

file

创建删除目录,文件,更改目录文件属性,更改文件权限。

常用参数:

  • path: 指定要操作的路径,dest和name都可以
  • state: 目标类型[absent(移除), directory(目录), file(文件), hard(硬链接), link(软连接), touch(新文件)]
  • src: 当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源
  • force: 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件
  • owner: 文件或目录属主
  • group: 文件或目录属组
  • recurse: 是否递归操作

ansible server -m file -a 'dest=/tmp/ansible mode=0755 owner=nginx group=nginx  state=directory'

192.168.198.150 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 991, 
    "group": "nginx", 
    "mode": "0755", 
    "owner": "nginx", 
    "path": "/tmp/ansible", 
    "size": 6, 
    "state": "directory", 
    "uid": 993
}

state:      目标类型[absent(移除), directory(目录), file(文件), hard(硬链接), link(软连接), touch(新文件)]

yum

提供yum方式的安装升级卸载等

常用参数

  • name: 用于指定软件包的名称
  • state: 指定软件包的状态。默认为present。 其中installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包
  • disable_gpg_check: 用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装
  • enablerepo: 用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源
  • disablerepo: 用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包
  • download_only: 仅下载包,不执行安装
  • download_dir: 用于存储包的目录
  • list: installed(已安装包)',updates(可更新包)', available(未安装包)' andrepos(源)'
ansible server -m yum -a "name=nginx state=present"

192.168.198.150 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "1:nginx-1.16.1-1.el7.x86_64 providing nginx is already installed"
    ]
}
192.168.198.151 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "1:nginx-1.18.0-1.el7.ngx.x86_64 providing nginx is already installed"
    ]
}

user

可以方便的创建,删除用户或管理现有的用户

常用参数

  • name: 用于操作的用户
  • uid: 用于指定user的uid
  • non_unqiue: 与uid参数搭配使用,允许改变UID为唯一值
  • group: 指定用户的主组
  • groups: 指定用户的附加属组
  • append: 跟groups参数一起使用管理用户属组,默认为false,如果 append='yes' ,则从groups参数中增加用户的属组;如果 append='no' ,则用户属组只设置为groups中的组,移除其他所有属组
  • state: 参数用于指定用户是否存在于远程主机中。可选值有 present、absent,默认值为 present
  • remove: 参数在 state=absent 时使用,为True时移除家目录
  • force: 参数在 state=absent 时使用, 保留家目录
  • home: 指定用户的家目录
  • create_home: 在用户创建时或home目录不存在时为用户创建home目录,布尔类型,默认值为 true
  • move_home: 如果设置为yes,结合home= 使用,临时迁移用户家目录到特定目录
  • comment: 指定用户注释信息
  • shell: 指定用户shell
  • system: 指定用户是否为系统用户
  • expires: 参数用于指定用户过期时间,你想要设置用户的过期日期为2019年07月10日,那么你首先要获取2019年07月10日的 unix 时间戳
  • password: 参数用于指定用户密码,但是这个密码不能是明文密码,而是一个对明文密码加密(md5,sha512,sha256等)后的字符串,默认为空
  • password_lock: 参数用于锁定指定用户,布尔类型,默认为空
  • update_password: 参数可选值有always 和 on_create,默认为always
    -- 当设置为always时,password参数的值与 /etc/shadow 中密码字符串不一致时更新用户的密码;
    -- 当设置为on_create时,password参数的值与 /etc/shadow 中密码字符串不一致时也不会更新用户的密码,但如果是新创建的用户,则此参数即使为on_create,也会更新用户密码。
  • generate_ssh_key: 参数用于指定是否生成ssh密钥对,布尔类型,默认为false。当设置为yes时,为用户生成 ssh 密钥对,默认在 ~/.ssh 目录中生成名为 id_rsa私钥 和 id_rsa.pub公钥,如果同名密钥已经存在,则不做任何操作
  • sssh_key_bits: 当 generate_ssh_key=yes 时,指定生成的ssh key加密位数。 ssh_key_file: 当 generate_ssh_key=yes 时,使用此参数指定ssh私钥的路径及名称,会在同路径下生成以私钥名开头以 .pub 结尾对应公钥。
  • ssh_key_comment: 当 generate_ssh_key=yes 时,在创建证书时,使用此参数设置公钥中的注释信息。如果同名密钥已经存在,则不做任何操作。当不指定此参数时,默认注释信息为"ansible-generated on $hostname”。
  • ** ssh_key_passphrase:** 当 generate_ssh_key=yes 时,在创建证书时,使用此参数设置私钥密码。如果同名密钥已经存在,则不做任何操作。
  • ssh_key_type: 当 generate_ssh_key=yes 时,在创建证书时,使用此参数指定密钥对的类型。默认值为 rsa,如果同名密钥已经存在,则不做任何操作。

[root@note0 ~]# ansible note1 -m user -a "name=test"
176.16.128.1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1000, 
    "home": "/home/test", 
    "name": "test", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}

sevice

管理远程机的服务

常用参数

  • enabled: 服务是否应在启动时启动。 *状态和启用状态至少是其中之一
  • name: 服务名称
  • pattern: 如果服务没有响应status命令,请在“ ps”命令的输出中找到要查找的子字符串,作为状态结果的替代。如果找到字符串,则服务将被假定为已启动
  • runlevel: 运行级别
  • state: 状态.[started(启动),stoped(停止),restarted(重启),reloaded(重新加载配置文件)]
  • use: 服务模块实际上使用系统特定的模块,通常通过自动检测,此设置可以强制使用特定的模块

ansible server -m service -a "name=nginx state=restarted"

setup

获取远程主机上的信息

常用参数

  • filter: 用于进行条件过滤,如果设置,仅返回匹配过滤条件信息。支持正则
ansible server -m setup -a 'filter=ansible_*'

ansible_all_ipv4_addresses:                仅显示ipv4的信息。
ansible_devices:                           仅显示磁盘设备信息。
ansible_distribution:                      显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:        显示是系统主版本。
ansible_distribution_version:              仅显示系统版本。
ansible_machine:                           显示系统类型,例:32位,还是64位。
ansible_eth0:                              仅显示eth0的信息。
ansible_hostname:                          仅显示主机名。
ansible_kernel:                            仅显示内核版本。
ansible_lvm:                               显示lvm相关信息。
ansible_memtotal_mb:                       显示系统总内存。
ansible_memfree_mb:                        显示可用系统内存。
ansible_memory_mb:                         详细显示内存情况。
ansible_swaptotal_mb:                      显示总的swap内存。
ansible_swapfree_mb:                       显示swap内存的可用内存。
ansible_mounts:                            显示系统磁盘挂载情况。
ansible_processor:                         显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:                   显示cpu个数(只显示总的个数)。