我写了更完善的Ansible专栏文章:一步到位玩儿透Ansible
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
1.1 ansible命令解释
通过ansible命令执行的任务称为ad-hoc命令(任务),其实它是相对playbook而言的。通常,命令行用来实现ansible的批量管理功能,playbook用来实现批量自动化功能。
【以下为普通选项:】-a MODULE_ARGS
--args=MODULE_ARGS
传递参数给模块
--ask-vault-pass
询问vault的密码
-B SECONDS
--background=SECONDS
异步后台方式执行任务,并在指定的秒数后超时,超时会杀掉任务的进程。默认是同步,即保持长连接,它会等待所有执行完毕(即阻塞模式)。但有时候是没必要这样的,比如某些命令的执行时间比ssh的超时时间还长。如果不指定超时秒数,将以同步方式运行任务
-P POLL_INTERVAL
--poll=POLL_INTERVAL
异步模式下轮训任务的时间间隔,默认10秒
-C
--check
不对远程主机做出一些改变,而是预测某些可能发生的改变
-D
--diff
当文件或模板发生了改变,显示出不同之处,和-C选项配合使用更佳
-e EXTRA_VARS
--extra-vars=EXTRA_VARS
配置额外的配置变量(key=value或者YAML/JSON格式)
-f FORKS
--forks=FORKS
指定并行处理的进程数量,默认为5个
-h
--help
显示帮助信息
-i INVENTORY
--inventory-file=INVENTORY
指定inventory文件,多个文件使用逗号分隔。默认为/etc/ansible/hosts
-l SUBSET
--limit=SUBSET
使用额外的匹配模式来筛选目标主机列表。此处的匹配模式是在已有匹配模式下进行的,所以是更严格的筛选。例如指定了主机组的情况下,使用-l选项从中只选一台主机进行控制
--list-hosts
不会执行任何操作,而是列出匹配到的主机列表
-m MODULE_NAME
--module-name=MODULE_NAME
指定要执行的模块名,默认的模块为"command"
-M MODULE_PATH
--module-path=MODULE_PATH
指定模块目录,默认未设置
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
new vault password file for rekey
-o
--one-line
简化输出(一行输出模式)
--output=OUTPUT_FILE
output file name for encrypt or decrypt; use - for stdout
--syntax-check
检查playbook的语法,不会执行
-t TREE
--tree=TREE
记录输出到此目录中(测试时以每个host名如IP地址为文件名记录,结果记录到对应的文件中)。
此选项在ansible巨慢的时候(如瞬间应该返回的命令还需要10多秒才完成)有奇用,或者将ansible的结果重定向到某个文件中也能解决,为什么如此,我也不明白(表面看来和输出方式有关系),多次亲测有效。
--vault-password-file=VAULT_PASSWORD_FILE
指定vault密码文件
-v
--verbose
输出详细信息,-vvv和-vvvv会输出更多新
--version
显示ansible的版本
【以下是连接选项,用于控制谁以及如何连接主机:】-k
--ask-pass
询问连接时的密码
--private-key=KEY_FILE
--key-file=KEY_FILE
使用文件来认证SSH连接过程。
-u REMOTE_USER
--user=REMOTE_USER
使用指定的用户名进行连接
-c CONNECTION
--connection=CONNECTION
连接类型,默认为ssh。paramiko (SSH), ssh, winrm and local. local is mostly useful for crontab or kickstarts.
-T TIMEOUT, --timeout=TIMEOUT
连接的超时时间,单位为秒,默认为10
--ssh-common-args=SSH_COMMON_ARGS
指定传递给sftp/scp/ssh等工具的通用额外参数
--sftp-extra-args=SFTP_EXTRA_ARGS
指定只传递给sftp的额外参数,如-f
--scp-extra-args=SCP_EXTRA_ARGS
指定只传递给scp的额外参数,如-l
--ssh-extra-args=SSH_EXTRA_ARGS
指定只传递给ssh的额外参数,如-R
【以下是权限控制选项:控制在目标主机上以什么身份和权限运行任务:】-s
--sudo
为运行ansible命令的用户提升权限为sudo_user的权限,此命令已废弃,使用become代替
-U SUDO_USER
--sudo-user=SUDO_USER
期望的sudo_user,默认为root,已废弃,使用become替代
-S
--su
使用su的方式执行操作,已废弃,使用become替代
-R SU_USER
--su-user=SU_USER
使用此user的su执行操作,默认为root,已废弃,使用become替代
-b
--become
使用become的方式升级权限
--become-method=BECOME_METHOD
指定提升权限的方式,可选以下几种:sudo/su/pbrun/pfexec/doas/dzdo/ksu/runas值
--become-user=BECOME_USER
要提升为哪个user的权限,默认为root
--ask-sudo-pass
询问sudo密码,已废弃,使用become替代
--ask-su-pass
询问su的密码,已废弃,使用become替代
-K
--ask-become-pass
询问become提升权限时的密码
1.2 常用模块
可以从ansible-doc -l | grep来找出想要的模块。再使用ansible-doc -s module_name来查看此模块的用法。官方模块列表和说明:https://docs.ansible.com/ansible/latest/modules_by_category.html
关于模块的使用方法,需要注意的是"state"。很多模块都会有该选项,且其值几乎都包含有"present"和"absent",表示肯定和否定的意思。
ansible绝大多数模块都天然具有幂等
特性,只有极少数模块如shell和command模块不具备幂等性。所谓的幂等性是指多次执行同一个操作不会影响最终结果。例如,ansible的yum模块安装rpm包时,如果待安装的包已经安装过了,则再次或多次执行安装操作都不会真正的执行下去。再例如,copy模块拷贝文件时,如果目标主机上已经有了完全相同的文件,则多次执行copy模块不会真正的拷贝。ansible具有幂等性的模块在执行时,都会自动判断是否要执行。
1.2.1 shell和command
默认ansible使用的模块是command,即可以执行一些shell命令。shell和command的用法基本一样,实际上shell模块执行命令的方式是在远程使用/bin/sh来执行的,如/bin/sh ping。
command不能解析变量(如$HOME)和某些操作符("<", ">", "|", ";"以及"&"),所以明确要使用这些不可解析的操作符时,使用shell模块来代替command。
ansible-doc -s shell
- name: Execute commands in nodes.
action: shell
chdir # 在执行命令前,先cd到指定的目录下
creates # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)存在,则不执行。
removes # 用于判断命令是否要执行。如果指定的文件(可以使用通配符)不存在,则不执行。
在ansible中使用shell或command模块一定要注意,它们默认不满足幂等性,很多操作会重复执行,但有些操作是不允许重复执行的。例如mysql的初始化命令mysql_install_db,它只能在第一次配置的过程中初始化一次,其他任何时候如非需要则不允许执行。这时候要实现幂等性,可以通过模块的creates和removes选项进行判断,但无论如何,在执行这两个模块的时候都需要考虑要执行的命令是否应该实现幂等性。
1.2.2 复制模块copy
ansible-doc -l | grep copy
copy Copies files to remote locations.
ec2_ami_copy copies AMI between AWS regions, return new image id
netapp_e_volume_copy Create volume copy pairs
nxos_file_copy Copy a file to a remote NXOS device over SCP.
unarchive Unpacks an archive after(optionally) copying it from the local machine.
vsphere_copy Copy a file to a vCenter datastore
win_copy Copies files to remote locations on windows hosts.
win_robocopy Synchronizes the contents of two directories using Robocopy.
使用方法:
ansible-doc -s copy
- name: Copies files to remote locations.
action: copy
backup=[yes|no] # 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no
dest= # 目标路径,只能是绝对路径,如果拷贝的文件是目录,则目标路径必须也是目录
content # 直接以content给定的字符串或变量值作为文件内容保存到远程主机上,它会替代src选项
directory_mode # 当对目录做递归拷贝时,设置了directory_mode将会使得只拷贝新建文件,
# 旧文件不会被拷贝。默认未设置
follow=[yes|no] # 是否追踪到链接的源文件。
force=[yes|no] # 设置为yes(默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝。
group # 设置远程文件的所属组
owner # 设置远程文件的所有者
mode= # 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。
# 也可以使用'u+rwx'或'u=rw,g=r,o=r'等方式设置。
src= # 拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了
# 斜杠"/",则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和
# 目录内的内容到远程。
默认情况下,ansible copy会检查文件md5查看是否需要拷贝,相同则不会拷贝,否则会拷贝。如果设置force=yes,则当文件md5不同时(即文件内容不同)才覆盖拷贝,设置force=no时,则只拷贝对方没有的文件。
ansible centos -m copy -a "src=/tmp/copy.txt dest=/tmp mode=0770 owner=sshd group=sshd backup=yes" -o -f 6
ll /tmp
-rwxrwx--- 1 sshd sshd 24 May 28 16:45 copy.txt
-rwxrwx--- 1 root root 22 May 28 16:39 copy.txt.10915.2017-05-28@16:45:14~ #这是备份文件
如果拷贝的是目录,则目标路径必须是目录路径。如果使用"/"结尾,则拷贝的是目录中的文件,如果不以斜杠结尾,则拷贝的是目录加目录中的文件。
mkdir /tmp/a
touch /tmp/a/{1..10}.txt
ansible centos -m copy -a "src=/tmp/a dest=/tmp" -o -f 6
1.2.3 template模块
template模块用法和copy模块用法基本一致,它主要用于复制配置文件。
ansible-doc -s template
- name: Templates a file out to a remote server.
action: template
backup # 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no
dest= # 目标路径
force # 设置为yes (默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝
group # 设置远程文件的所属组
owner # 设置远程文件的所有者
mode # 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。
# 也可以使用'u+rwx' or 'u=rw,g=r,o=r'等方式设置
src= # ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径
validate # 在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。
# 一般用于检查配置文件语法,语法正确则保存到目标位置。
# 如果要引用目标文件名,则使用%s,下面的示例中的%s即表示目标机器上的/etc/nginx/nginx.conf。
ansible centos -m template -a "src=/tmp/nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=0770 owner=root group=root backup=yes validate='nginx -t -c %s'" -o -f 6
虽然template模块可以按需求修改配置文件内容来复制模板到被控主机上,但是有一种情况它是不能解决的:不同被控节点所需的配置文件差异很大,并非修改几个变量就可以满足。例如在centos 6和centos 7上通过yum安装的nginx,它们的配置文件内容相差非常大,且centos 6上的nginx的默认就有一个/etc/nginx/conf.d/default.conf。如果直接复制同一个模板的nginx配置文件到centos 6和centos 7上,很可能导致某一版本的nginx不能启动。
这时就有必要在复制模板时挑选对应发行版的模板文件进行配对复制,例如要复制到centos 6上的源模板是nginx6.conf.j2,复制到centos 7上的源模板是nginx7.conf.j2。这种行为可以称之为"基于变量选择文件或模板"。
---
- tasks:
- name: template file based var
template: src=/templates/nginx{{ ansible_distribution_major_version }}.conf.j2 dest=/etc/nginx/nginx.conf validate="/usr/sbin/nginx -t -c %s"
还可以在文件内容中指定jinja2的替代变量,在ansible执行时首先会根据变量内容进行渲染,渲染后再执行相关模块。例如,此处的template模块,复制一个基于发行版本号的yum源配置文件。以下是某个repo文件模板base.repo.j2的内容。
[epel]
name=epel
baseurl=http://mirrors.aliyun.com/epel/{{ ansible_distribution_major_version }}Server/x86_64/
enable=1
gpgcheck=0
再复制即可。
--- - tasks: - template: src=my.repo.j2 dest=/etc/yum.repos.d/my.repo
1.2.4 文件模块file
管理文件、目录的属性,也可以创建文件或目录。
ansible-doc -s file
- name: Sets attributes of files
action: file
group # file/directory的所属组
owner # file/directory的所有者
mode # 修改权限,格式可以是0644、'u+rwx'或'u=rw,g=r,o=r'等
path= # 指定待操作的文件,可使用别名'dest'或'name'来替代path
recurse # (默认no)递归修改文件的属性信息,要求state=directory
src # 创建链接时使用,指定链接的源文件
state # directory:如果目录不存在则递归创建
# file:文件不存在时,不会被创建(默认值)
# touch:touch由path指定的文件,即创建一个新文件,或修改其mtime和atime
# link:修改或创建软链接
# hard:修改或创建硬链接
# absent:目录和其中的文件会被递归删除,文件或链接将取消链接状态
需要注意的是,file模块可以递归创建目录,但是不能在不存在的目录中创建文件,只能先创建目录,再在此目录中创建文件。
创建目录,并递归修改目录的属性。
ansible 192.168.100.63 -m file -a 'path=/tmp/xyz state=directory owner=root group=root mode=0755 recurse=yes'
修改目录中属性。
ansible 192.168.100.63 -m file -a 'path=/tmp/xyz state=touch mode=0644'
创建或修改文件属性。
ansible 192.168.100.63 -m file -a 'path=/tmp/xyz/a.txt state=touch mode=0644'
1.2.5 fetch拉取文件模块
和copy工作方式类似,只不过是从远程主机将文件拉取到本地端,存储时使用主机名作为目录树,且只能拉取文件不能拉取目录。
ansible-doc -s fetch
- name: Fetches a file from remote nodes
action: fetch
dest= # 本地存储拉取文件的目录。例如dest=/data,src=/etc/fstab,
# 远程主机名host.exp.com,则保存的路径为/data/host.exp.com/etc/fstab。
fail_on_missing # 当设置为yes时,如果拉取的源文件不存在,则此任务失败。默认为no。
flat # 改变拉取后的路径存储方式。如果设置为yes,且当dest以"/"结尾时,将直接把源文件
# 的basename存储在dest下。显然,应该考虑多个主机拉取时的文件覆盖情况。
src= # 远程主机上的源文件。只能是文件,不支持目录。在未来的版本中可能会支持目录递归拉取。
validate_checksum # fetch到文件后,检查其md5和源文件是否相同。
# 存储为/tmp/localhost/etc/fstab
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp"
# 存储为/tmp/fstab
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp/ flat=yes"
# 存储为/tmp/fstab-localhost
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes"
1.2.6 rsync模块synchronize
synchronize模块用于实现rsync的简单版常用功能,它无法实现完整版的rsync,毕竟rsync功能太多太细致。如果要使用rsync,还是应该使用command或shell模块来调用rsync命令。
完整的rsync功能见rsync命令中文手册。
ansible-doc -s synchronize
- name: A wrapper around rsync to make common tasks in your playbooks quick and easy.
action: synchronize
src= # 指定待传输的源文件。可以是相对路径,也可以是绝对路径。
dest= # 目标路径。可以是绝对路径,也可以是相对路径。
mode # 指定推(push)还是拉(pull)的传输模式。
# push时,本地为sender端,pull时,远程为sender端。默认为push。
archive # 等价于rsync的"-a"选项,即使用归档模式。它等价于rsync的"-rtopgDl"选项。值为yes/no。
times # 保留mtime属性。
group # 保留所属组属性。
owner # 保留所有者属性。
links # 拷贝链接文件自身。
perms # 保留权限属性。
recursive # 递归到目录中的文件。
compress # 传输过程中压缩传输。应该总是开启,除非遇到问题。即rsync的"-z"选项。
copy_links # 拷贝软链接的文件名和其指向的文件的内容。即a指向b文件时,将在目标端生成a普通
# 文件,但此文件中的内容是b中的内容。
dirs # 非递归方式传输目录。
delete # 目标端如果比源端文件多,则删除这些多出来的文件,要求recursive=yes。
checksum # 等价于"-c"选项,将基于文件的checksum来判断是否同步,而不是默认的quick check
# 算法,该算法基于文件大小和最近的mtime来判断是否要同步。该选项会大幅降低效率,
# 应谨慎使用。注意,它无法影响archive,即archive仍会启用。
existing_only # receiver端没有的文件不同步。但仍会传输,只是临时文件重组后不重命名而已。
partial # 等价于"--partial"选项。默认rsync在传输中断时会删除传输了一半的文件,指定该选
# 项将保留这部分不完整的文件,使得下次传输时可以直接从未完成的数据块开始传输。
dest_port # ssh的连接端口。
rsync_opts # 指定额外的rsync选项。使用数组的方式传递这些选项。
rsync_path # 等价于"--rsync-path"选项,目的是启动远程rsync。
# 例如可以指定[--rsync-path=rsync],甚至[--rsync-path=cd /tmp/c && rsync]。
# 当不指定rsync路径时,默认为/usr/bin/rysnc。
rsync_timeout # 指定rsync在多久时间内还没有数据传输就超时退出。
verify_host # 对目标主机进行ssh的host key验证。
1.2.7 包管理模块yum
ansible-doc -s yum
- name: Manages packages with the `yum' package manager
action: yum
disable_gpg_check # 安装包时禁止gpgcheck,仅在state=present或latest时生效。
disablerepo # 禁用指定的repoid,多个repoid使用逗号分隔。
enablerepo # 明确使用该repoid
exclude # 排除哪些包不安装,仅在state=present或latest时生效。
list # 类似于yum list
name= # 指定安装的包名,可带上版本号.
state # 状态。('present'、'installed','latest')用于安装包,
# ('absent'、'removed')用于移除已安装包。
update_cache # 强制更新yum的cache。
name需要配合state来使用,如果state指定为present/installed/latest将安装包,其中latest是安装最新包,默认为present。如果指定为absent/removed则用于卸载包。
在ansible中,很多地方都会出现present和absent的状态,它们一般都表示目标是否应该存在还是不存在,也就是要进行的动作是创建和删除。
列出和ansible相关的包。
ansible centos -m yum -a "list=ansible" -f 6
安装包。
ansible centos -m yum -a "name=dos2unix state=installed" -o -f 6
安装本地的包,且排除某些包不安装。
ansible centos -m yum -a "name=/tmp/*.rpm exclude=*unix* state=present"
卸载包。
ansible centos -m yum -a "name=dos2unix state=removed" -o -f 6
1.2.8 配置yum源模块yum_repository
用于配置yum源。可以实现非常完整的yum仓库配置。但是一般只需简单的添加yum源即可。所以,以下是简单版的用法和示例。
ansible-doc -s yum_repository
- name: Add or remove YUM repositories
action: yum_repository
baseurl # 地址
mirrorlist # 设置mirrorlist地址
description # 描述信息
enabled # 是否启用该仓库,默认为yes
file # 保存此仓库的文件,不设置该项的话则默认以name选项中的名称命名,将自动以".repo"后缀结尾。
gpgcheck # 是否要进行gpgcheck
name= # 仓库的名称,要保证名称的唯一性
reposdir # 保存.repo文件的目录,默认/etc/yum.repos.d/
state # repo文件的状态,present/absent,默认present。
例如:
- name: Add repository
yum_repository:
name: aliyun_epel
description: EPEL YUM repo
baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
- name: Add multiple repositories into a file
yum_repository:
name: epel
description: EPEL YUM repo
file: sohu_epel
baseurl: http://mirrors.sohu.com/fedora-epel/7/$basearch/
gpgcheck: no
ansible 192.168.100.63 -m yum_repository -a 'name=aliyun_epel description="epel repo" baseurl=http://mirrors.aliyun.com/epel/7/$basearch/ gpgcheck=no enabled=yes'
查看生成的repo文件。
[root@server2 ~]# ansible 192.168.100.63 -m shell -a "cat /etc/yum.repos.d/aliyun_epel.repo"
192.168.100.63 | SUCCESS | rc=0 >>
[aliyun_epel]
baseurl = http://mirrors.aliyun.com/epel/7/$basearch/
enabled = 1
gpgcheck = 0
name = epel repo
1.2.9 服务管理模块service
ansible-doc -s service
- name: Manage services.
action: service
enabled # 设置服务为开机自启动,默认为no
name= # 服务名
state # 'started'和'stoped'分别启动和停止服务,它们是幂等操作,多次启动或停止服务的结果是一样的,
# 也就是说对于运行中的服务不会再执行启动操作,同理停止也是一样。'restarted'总是重启服务,
# 'reloaded'总是重读配置文件,如果服务是未运行状态,则'reloaded会启动服务。
# (state和enabled两者至少要给一个)
设置httpd开机自启动。
ansible centos -m service -a 'name=httpd enabled=yes' -f 6 -o
启动httpd服务。
ansible centos -m service -a 'name=httpd state=started' -f 6 -o
1.2.10 服务管理模块systemd
管理systemd风格的服务。
ansible-doc -s systemd
- name: Manage services.
action: systemd
daemon_reload # 在执行所有动作之前,先确定是否要reload一次。值为yes/no。
enabled # 是否设置开机自启动。
masked # 是否将此unit做mask(隐藏、掩盖)处理。mask后的unit将无法启动。
name= # 待操作服务名。可以是name,也可以是name.service。
state # 'started'/'stopped'具有幂等性。但restarted和reloaded总是会执行。
1.2.11 用户管理模块user
同理还有组管理模块group,就不多做说明了。
ansible-doc -s user
- name: Manage user accounts
action: user
name= # 要创建、修改、移除的用户名。
password # 设置用户密码。此处只能使用加密密码作为值。
system # 设置为yes表示创建一个系统用户,只能用于创建,不能用于修改已有用户为系统用户。
state # 创建用户(present)还是删除用户(absent)。默认为present。
createhome # 创建家目录,或者已有的用户但家目录不存在也会创建。设置为no则不创建家目录。
home # 指定要创建的家目录路径
move_home # 如果设置为yes,则"home="则表示将家目录移动到此选项指定的路径下。
uid # 设置用户的uid
group # 设置用户的primary group
groups # 将用户加入到辅助组列表中。如果设置"groups=",则会将此用户从所有辅助组中移除。
shell # 设置用户的shell。
force # 配合'state=absent'时,等价于'userdel --force',即强制删除用户、家目录和邮件列表。
remove # 配合'state=absent'时,等价于'userdel --remove',即删除家目录和邮件列表。
update_password # user是幂等模块,"always"将总是修改密码。"on_create"将只在创建用户时设置密码。
创建系统用户,并指定shell。
ansible centos -m user -a "name=longshuai system=yes shell=/sbin/nologin"
删除用户。
ansible centos -m user -a "name=longshuai state=absent"
指定update_password=always
将总是修改用户的密码,不管该用户是否已存在。而update_password=on_create
则只有新创建用户时才设置密码,如果用户已存在,则不会修改该用户的密码。默认值就是always。
openssl passwd -1 123456
$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/
ansible centos -m user -a 'name=longshuai3 password="$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/" update_password=always'
创建用户并指定密码,但如果用户已存在则不修改密码。
openssl passwd -1 234567
$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/
ansible centos -m user -a 'name=longshuai3 password="$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/" update_password=on_create'
1.2.12 authorized_key模块
ansible-doc -s authorized_key
- name: Adds or removes an SSH authorized key
action: authorized_key
key= # 公钥路径,可以是本地文件,可以是url地址。
# 本地文件时使用{{ lookup('file', '~/.ssh/id_rsa.pub') }},
# url使用https://github.com/username.keys。
manage_dir # 是否创建或修改目标authorized_keys所在目录的所有者和权限。默认为yes。
# 使用自定义的目标路径时,必须设置为no或false
path # authorized_keys所在的目录,默认为家目录下的.ssh目录中
state # present/absent,是否将密钥添加到目标authorized_keys文件中。
user= # 添加到远程哪个用户下的authorized_keys文件
例如将公钥添加到centos组中的机器中。使用-k选项用于询问ssh连接的密码。
ansible centos -m authorized_key -a "key={{lookup('file','~/.ssh/id_rsa.pub')}} state=present user=root" -k
要想使用该模块实现非交互,需要在inventory文件中指定主机或主机组中加上"ansible_ssh_pass='PASSWORD'"参数。例如:
192.168.100.65 ansible_ssh_pass='123456'
[centos6]
host1
host2
host3
[centos6:vars]
ansible_ssh_pass='123456'
但这样不会将主机密钥添加到主控制端的known_hosts文件中,因此下次执行ansible时会失败。可以在配置文件中做如下设置:
host_key_checking = False
或者干脆使用expect非交互更方便。
1.2.13 debug模块
用于输出自定义的信息,类似于echo、print等输出命令。ansible中的debug主要用于输出变量值、表达式值,以及用于when条件判断时。使用方式非常简单。
ansible-doc -s debug - name: Print statements during execution action: debug msg # 输出自定义信息。如果省略,则输出普通字符。 var # 指定待调试的变量。只能指定变量,不能指定自定义信息,且变量不能加{{}}包围,而是直接的变量名。 verbosity # 控制debug运行的调试级别,有效值为一个数值N。
例如:
ansible centos -m debug -a 'msg="i want to print this messages"'
ansible centos -m debug -a 'var=ansible_eth0.ipv4.address'
可以输出变量值,不过一般使用到变量的时候都会在playbook中使用debug模块,以下是一个示例:
tasks:
- name: print any messages
debug: msg="you name is {{ name }}"
1.2.14 定时任务模块cron
cron模块用于设置定时任务,也用于管理定时任务中的环境变量。
ansible-doc -s cron
- name: Manage cron.d and crontab entries.
action: cron
backup # (yes/no)如果设置了,则会在修改远程cron_file前备份这些文件
cron_file # 自定义cron_file的文件名,使用相对路径则表示在/etc/cron.d中。必须同时指定user选项
user # 指定哪个用户的crontab将要被修改,默认修改的用户为主控端所在的用户名id的映射
disabled # 禁用crontab中的某个job,要求state=present
env # (yes/no)设置一个环境变量,将添加在crontab的顶端。使用name和value定义变量名和值
job # 需要执行的命令。如果设置了env,则表示环境变量的值,此时job="XXXX"等价于value="XXXX"。
# 要求state=present
minute # 分(0-59, *, */N),不写时,默认为*
hour # 时(0-23, *, */N),不写时,默认为*
day # 日(1-31, *, */N),不写时,默认为*
month # 月(1-12, *, */N),不写时,默认为*
weekday # 周(0-6 for Sunday-Saturday, *),不写时,默认为*
name # 描述crontab任务的字符串。但如果设置的是env,则name为环境变量的名称。要求state=absent
# 注意,若未设置name,且state=present,则总会创建一个新job条目,即使cron_file中已经存在
# 同样的条目
special_time # 定时任务的别称,用于定义何时运行job条目。
# 有效值有reboot/hourly/daily/weekly/monthly/yearly/annually。
state # job或者env的状态是present(默认)还是absent。present用于创建,absent用于移除
除了cron模块本身可以管理cron的环境变量,另一个模块cronvar也可以定义定时任务的环境变量。
ansible-doc -s cronvar
- name: Manage variables in crontabs
action: cronvar
backup # (yes/no)如果设置了,则会在修改远程cron_file前备份这些文件
cron_file # 自定义cron_file的文件名,使用相对路径则表示在/etc/cron.d中
state # present用于创建变量,absent用于移除变量
user # 指定哪个用户的crontab将要被修改,默认为root
value # 环境变量的值,要求state=present
例如:创建一个job,每2分钟进行一次时间同步,并且自定义cron_file。
ansible centos7 -m cron -a 'name="ntpdate" job="/usr/sbin/ntpdate ntp1.aliyun.com" cron_file=ntpdate_cron user=root minute=*/2' -o
验证是否添加正确。
ansible centos7 -m shell -a 'cat /etc/cron.d/ntpdate_cron'
192.168.100.65 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com
192.168.100.63 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com
192.168.100.64 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com
移除一个job,要求name必须匹配。如有必要,需要同时指定cron_file和user。
ansible centos7 -m cron -a 'name="ntpdate" state=absent cron_file=ntpdate_cron user=root' -o
设置crontab环境变量,并定义一个job。
ansible centos7 -m cron -a 'env=yes name=app_home value=/tmp' -o
ansible centos7 -m cron -a 'name="ntpdate" job="/usr/sbin/ntpdate ntp1.aliyun.com" minute=*/2' -o
验证设置结果。
ansible centos7 -m shell -a 'crontab -l'
192.168.100.65 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
192.168.100.63 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
192.168.100.64 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
1.2.15 归档模块archive
用于在远端压缩文件。当然,前提是在远端主机上要有对应的压缩工具。支持zip/gz/tar/bz2。
ansible-doc -s archive
- name: Creates a compressed archive of one or more files or trees.
action: archive
dest # 目标归档文件名。除非path指定要压缩的是单文件,否则需要dest选项
format # 指定压缩格式,默认为gz格式
group # 文件/目录的所属组
owner # 文件/目录的所有者
mode # 设置文件/目录的的权限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
path= # 要压缩的文件,可以是绝对路径,也可以是glob统配的路径,还可以是文件列表
remove # 压缩后删除源文件
例如:
# 将目录/path/to/foo/压缩为/path/to/foo.tgz
- archive:
path: /path/to/foo
dest: /path/to/foo.tgz
# 压缩普通文件/path/to/foo为/path/to/foo.gz并删除源文件,由于压缩的是单文件,所以可以省略dest选项
- archive:
path: /path/to/foo
remove: True
# 将单文件/path/to/foo压缩为zip格式
- archive:
path: /path/to/foo
format: zip
# 将给定的文件列表压缩为bz2格式,压缩包路径为/path/file.tar.bz2
- archive:
path:
- /path/to/foo
- /path/wong/foo
dest: /path/file.tar.bz2
format: bz2
1.2.16 解包模块unarchive
默认复制ansible端的归档文件到被控主机,然后在被控主机上进行解包。如果设置选项remote_src=yes,则表示解包被控主机上的归档文件。
要求在被控主机上有对应的解包命令。unzip命令用于解压".zip"文件,gtar(tar包提供)命令用于解压".tar"、".tar.gz"、".tar.bz2"和".tar.xz"。
ansible-doc -s unarchive
- name: Unpacks an archive after (optionally) copying it from the local machine.
action: unarchive
creates # 如果指定的文件存在则不执行该任务。可用于实现幂等性
dest= # 远程机器上需要被解包的归档文件,要求是绝对路径
exclude # 列出解包过程中想要忽略的目录和文件
group # 文件/目录的所属组
owner # 文件/目录的所有者
mode # 设置文件/目录的的权限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
keep_newer # 在解包过程中,如果目标路径中和包中有同名文件,且比包中的文件更新,则保留新的文件
list_files # 设置为true时,将返回归档文件中的文件列表
remote_src # 设置为yes表示远程主机上已有目标归档文件,即不再从本地复制归档文件到远端,直接在远端解包。
# 默认为no
src= # 如果remote_src=no,将复制本地归档文件到远端,可相对路径也可绝对路径.
如果remote_src=yes, 将解包远程已存在的归档文件
如果remote_src=yes且src中包含了"://",将指挥远程主机从url中下载文件并解包
例如:
# 复制ansible端的foo.tgz文件到远端并解包
- unarchive:
src: foo.tgz
dest: /var/lib/foo
# 直接解包远端已经存在的文件- unarchive:
src: /tmp/foo.zip
dest: /usr/local/bin
remote_src: True
# 从url上下载压缩包,然后进行解压
- unarchive:
src: https://example.com/example.zip
dest: /usr/local/bin
remote_src: True
1.2.17 下载模块get_url
ansible-doc -s get_url
- name: Downloads files from HTTP, HTTPS, or FTP to node
action: get_url
backup # 下载文件时同时创建一个名称中包含时间戳的备份文件
dest= # 文件保存路径,必须为绝对路径。
# 如果dest是一个目录,则使用url的base name作为文件名
# 如果dest是一个目录,则'force'选项不生效
# 如果dest是一个目录,则总是会下载目标文件,但只在已存在的文件变化了才会替换旧文件
force # 如果设置为yes,且dest不是一个目录时,则总是会下载文件,但只在已存在的文件变化了才会替换旧文件
# 如果设置为no(默认),则只会在目录路径下不存在该文件时才会进行下载。
tmp_dest # 下载时临时存放目录,在任务执行完成前会删除下载的临时文件
group # 文件/目录的所属组
owner # 文件/目录的所有者
mode # 设置文件/目录的的权限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
timeout # 请求url时的超时时间,默认10秒钟
url= # 要下载的url路径,(http|https|ftp)://[user[:pass]]@host.domain[:port]/path
# 还支持file格式的路径,实现复制功能。file:///path/to/file
注意,dest为目录或者force=yes时,总是会下载文件到临时存放目录中,只不过不一定会替换旧文件。只有force=no(默认)且dest是一个文件时,在文件已存在时才不会下载文件。
例如:
# 下载foo.conf,若/etc/foo.conf已存在,则不下载该文件
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
mode: 0440
# 下载foo.conf到/tmp目录下,若/tmp/foo.conf已存在则检查文件是否相同,不相同则进行替换
get_url:
url: http://example.com/path/file.conf
dest: /tmp/
# 复制一个本地文件
get_url:
url: file:///tmp/afile.txt
dest: /tmp/afilecopy.txt
1.2.18 wait_for模块
有些时候任务之间对状态、文件、端口等资源是有依赖关系的,只有满足了前提,任务才会继续。wait_for模块就是用于判断任务在满足什么条件的情况下会继续。主要用来判断端口是否开启、文件是否存在、文件中是否存在某些字符串。
ansible-doc -s wait_for
- name: Waits for a condition before continuing.
action: wait_for
delay # 在检查操作进行之前等待的秒数
host # 等待这个主机处于启动状态,默认为127.0.0.1
port # 等待这个端口已经开放
path # 这个文件是否已经存在
search_regex # 在文件中进行正则匹配
state # present/started/stopped/absent/drained.默认started
当检查的是一个端口时:
started:保证端口是开放的
stopped:保证端口是关闭的
当检查的是一个文件时:
present/started:在检查到文件存在才会继续
absent:检查到文件被移除后才会继续
sleep # 两次检查之间sleep的秒数,默认1秒
timeout # 检查的等待超时时间(秒数,默认300)
例如:
# 连接上主机后10秒后才检查8000端口是否处于开放状态,300秒(默认值)内未开放则超时。
- wait_for:
port: 8000
delay: 10
# 直到/tmp/foo文件存在才会继续
- wait_for:
path: /tmp/foo
# 直到/tmp/foo文件中能匹配"completed"字符串才继续
- wait_for:
path: /tmp/foo
search_regex: completed
# 直到/var/lock/file.lock这个锁文件被移除了才继续
- wait_for:
path: /var/lock/file.lock
state: absent
# 直到/proc/3466/status文件被移除才继续,可用来判断进程是启动还是停止,pid文件是存在还是被移除等
- wait_for:
path: /proc/3466/status
state: absent
1.2.19 script模块
script模块用于控制远程主机执行脚本。在执行脚本前,ansible会将本地脚本传输到远程主机,然后再执行。在执行脚本的时候,其采用的是远程主机上的shell环境。
ansible-doc -s script
- name: Runs a local script on a remote node after transferring it
action: script
chdir # 在远程执行脚本前先切换到此目录下。
creates # 当此文件存在时,不执行脚本。可用于实现幂等性。
removes # 当此文件不存在时,不执行脚本。可用于实现幂等性。
free_form= # 本地待执行的脚本路径、选项、参数。之所以称为free_form,是因为它是脚本名+选项+参数。
例如,将ansible端/tmp/a.sh发送到各被控节点上执行,但如果被控节点的/tmp下有hello.txt,则不执行。
---
- hosts: centos
remote_user: root
tasks:
- name: execute /tmp/a.sh,but only /tmp/hello.txt is not yet created
script: /tmp/a.sh hello
args:
creates: /tmp/hello.txt