语法
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -u USERNAME -c CONNECTION
参数:
- -m:要执行的模块,默认为command
- -a:模块的参数
- -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
- -k:提示输入ssh登录密码,当使用密码验证的时候用
- -s:sudo运行
- -U:sudo到哪个用户,默认为root
- -K:提示输入sudo密码,当不是NOPASSWD模式时使用
- -C:只是测试一下会改变什么内容,不会真正去执行
- -c:连接类型(default=smart)
- -f:fork多少进程并发处理,默认为5个
- -i:指定hosts文件路径,默认default=/etc/ansible/hosts
- -I:指定pattern,对已匹配的主机中再过滤一次
- --list-host:只打印有哪些主机会执行这个命令,不会实际执行
- -M:要执行的模块路径,默认为/usr/share/ansible
- -o:压缩输出,摘要输出
- --private-key:私钥路径
- -T:ssh连接超时时间,默认是10秒
- -t:日志输出到该目录,日志文件名以主机命名
- -v:显示详细日志
hosts配置
一般流程
- 编辑/etc/ansible/hosts
- 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id
- 添加本机的私钥到Ansible所
- 运行ansible all -m ping 测试是否添加成功
Inventory 分组
Ansible可同时操作属于一个组的多台主机,组和主机之间的关系通过inventory文件配置,默认文件路径为/etc/ansible/hosts
常用参数
ansible_ssh_host # 目标主机地址
ansible_ssh_port # 目标主机端口,默认22
ansible_ssh_user # 目标主机用户
ansible_ssh_pass # 目标主机ssh密码
ansible_sudo_pass # sudo密码
ansible_sudo_exe
ansible_connection # 与主机的连接类型,比如:local,ssh或者paramiko
ansible_ssh_private_key_file # 私钥地址
ansible_shell_type # 目标系统的shell类型
ansible_python_interpreter # python版本
格式
[test] # 组名
172.18.0.11 # 主机ip 或者1172.18.0.11:65522 自定义端口(不指明,则使用ansible.cfg文件中“remote_port”定义的端口,如果没有定义则使用默认的22端口)
别名
s1 ansible_ssh_port=65522 ansible_ssh_host=10.0.0.1 ansible_ssh_user=simon # 别名s1
连续主机的表达
[g1]
g[1:50].example.com # 数字连续
g[a-f].example.com # 字母连续
hosts简单配置示例
[all:vars] # *:vars 块变量,all:vars 全局变量
ansible_ssh_private_key_file=/root/.ssh/id_rsa
ansible_ssh_port=22
ansible_ssh_user=root
[t3:vars]# t3 使用python解释器是python2
ansible_python_interpreter=/usr/bin/python2
nginx_port=80# 私有变量在playbooks中使用
[t3]
192.168.11.162
Inventory 分文件管理
分文件管理即文件名就是组名
分文件
/etc/ansible/group_vars/vim
/etc/ansible/group_vars/webservers
vim 文件中的内容: 变量
ntp_server: acme.example.org
db_server: 10.0.0.1
分文件夹(文件夹就是组名)
/etc/ansible/group_vars/vim/install
/etc/ansible/group_vars/vim/init
/etc/ansible/host_vars/foosball
常用模块
系统模块
setup
作用:用于统计系统的相关信息
例子:ansible test -m setup
参数:
- filter: 过滤要显示的内容
- ansible test -m setup -a "filter=ansible_python_version" # 只获取主机ansible_python_version的值
- 更多的帮助 ansible-doc setup
常用信息:
- 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个数(只显示总的个数)。
service
作用:用于管理服务
# 参数
- arguments: 给命令行提供一些选项
- enable:是否开机启动 yes | no
- name:服务名称
- pattern:定义一个模式,如果通过status命令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务已经在运行,否则会认为未启动( ps aux | grep `pattern` )
- runlevel:运行级别
- sleep:如果执行了,restarted,则在 stop 和 start 之间沉睡几秒钟
- state:started、stoped、restarted和reloaded,其中started和stoped是幂等的,也就是说如果服务已经停止,那么运行stoped不会执行任何操作
使用方式:
ansible test -m service -a 'name=nginx state=started enabled=yes' -k # 启动nginx进程,并设置为开机启动
ansible test -m service -a 'name=nginx state=stopped' -k # 关闭nginx进程
ansible test -m service -a 'name=network state=restarted arguments=eth0' -k # 重启network进程,并传递eth0 作为参数,即:重启eth0网卡
ansible test -m service -a 'name=nginx pattern=/usr/local/nginx state=started' -k # 如果无法使用 service nginx status查寻到nginx的状态,那么会使用 ps 来过滤 pattern指定的关键字,如果存在,则表示程序已经正常启动
cron
作用:用于管理定时任务
# 参数
- backup: 对远程主机上的原计划内容修改之前做备份
- cront_file: 如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户计划任务
- day: 日(1-31,*,*/2,......)
- hour: 小时(0-23,*,*/2,......)
- minute: 分钟(0-59,*,*/2,......)
- mouth: 月(1-12,*,*/2,......)
- weekday: 周(0-7,*,......)
- job: 要执行的任务,依赖于state=present
- name: 该任务的描述,必选项。
- special_time:指定什么时候执行(被触发),参数:reboot,yearly,annually,monthly,weekly,daily,hourly。
- state:确认该任务计划是创建还是删除 Present(启用) | Absent(停用)
- user:以哪个用户的身份执行
使用方式:
ansible test -m cron -a "hour=3 month=2 day=1 job='echo hello' name='test' state=present " -k # 添加一条定时任务,* 3 1 2 * echo hello
ansible test -m cron -a 'name=test state=absent' -k # 删除name为test的计划任务
user
作用:用于管理用户(useradd,userdel) 也可以用command模块来执行shell命令创建和管理用户
# 参数
- home:指定用户的家目录
- createhome: 是否创建用户家目录 yes | no
- groups:用户的属组
- uid:用户的uid
- password:用户的密码
- name:用户的名称
- system:是否是系统用户
- remove:是否删除用户家目录
- state:具体的操作, 删除/添加, present | absent
- shell: 指定用户的shell
文件模块
file
作用:设置文件属性,file模块除了建立文件/文件夹,还可以建立软/硬连接
参数:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
=directory:如果目录不存在,创建目录
=file:即使文件不存在,也不会被创建
=link:创建软链接
=hard:创建硬链接
=touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
=absent:删除目录、文件或者取消链接文件
使用方式:
#在playbook创建软连接
- name: "将go命令软连接到/usr/bin/go"
file:
src: /usr/lib/go-11.1/bin/go
dest: /usr/bin/go
state: link
#在命令行中使用
# 等于 ln -s /etc/fstab /tmp/fstab
ansible test -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link' -k
# 删除文件
ansible test -m file -a 'path=/tmp/fstab state=absent' -k
# 创建文件指定其属主,属组,权限
ansible test -m file -a 'path=/tmp/lixin.txt state=touch owner=nobody group=nobody mode=666' -k
copy
作用:复制文件到远程主机,每次备份会产生一个MD5SUM,如果两次赋值文件的MD5SUM相同,那么就不会再次执行复制动作。
参数:
- backup:在覆盖之前将原文件备份,备份文件名包含时间信息。有两个选项:yes | no
- src:源文件,如果是目录的话,会递归赋值,包括目录本身,如果目录为/,那么只会复制目录下的文件
- dest:目标文件路径
- others:所有file模块里的选项都可以在这里使用
- content:用于替代'src',可以直接设定文件的值
- directory_mode:递归设定目录的权限,默认为系统默认权限
- force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当前目标主机的目标位置不存在该文件时,才复制,默认为yes。
- owner参数: 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
- group参数: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
- mode参数: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r--r--",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
使用方式:
# 在目录主机上创建tmp.txt文件,内容为hello world
ansible test -m copy -a "content='hello world' dest=/tmp/tmp.txt" -k
fetch
作用:将远程系统上的文件或目录拷贝到本地
参数:
dest:指出复制文件的目标及位置,使用绝对路径,如果源是目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
==关于复制文件/文件夹注意事项==
- 拷贝文件时 src=/etc/passwd dest=/tmp/passwd :
如果远程客户端 /tmp/passwd 文件存在,则会更新成源文件
如果远程客户端 /tmp/passwd 文件不存在,则会直接拷贝源文件
如果远程客户端存在 /tmp/passwd 目录,则会把源文件拷贝到 /tmp/passwd 目录下,最终文件是 /tmp/passwd/passwd
- 拷贝目录时 src=/etc/ansible dest=/tmp :
如果远程客户端 /tmp/ansible 目录不存在,则会直接把源目录拷贝成这个目录名
如果远程客户端 /tmp/ansible 目录存在,则会把源目录拷贝到该目录下,最终目录是 /tmp/ansible/ansible
template
作用:模版,用于将模版文件渲染后,输出到远程主机上,模版文件一般以.j2为结尾,标识其是一个jinja2模版文件
# 参数
- src:模版文件的路径
- dest:拷贝到远程主机上的位置
- mode:权限
- attributes: 特殊权限 类似于 chattr
- force:存在覆盖
- group:属组
- owner:属主
unarchive
作用:用于解压文件,其作用类似于Linux下的tar命令,默认情况下unarchive的作用是将控制节点的压缩包拷贝到远程服务器上,然后进行解压
参数:
- remote_src: 用来表示需要解压的文件存在远程服务器中还是本地服务器中,默认为no,表示解压前先将控制节点上的文件复制到远程主机上中,然后再进行解压。
- src:指定压缩文件的路径,该选项取决于remote_src的取值,如果remote_src取值为yes,则src指定的是远程服务器中压缩包的地址,如果remote_src取值为no,则src指向的是控制节点中的路径
- dest:该选项指定的是远程服务器上的绝对路径,表示压缩文件解压的路径
- list_files: 默认情况下该选项的取值为no,如果该选项取值为yes,也会解压缩文件,并且在ansible的返回值中列出压缩包里的文件;
- exclude:解压文件时排出exclude选项指定的文件或目录列表
- keep_newer: 默认值为False,如果该选项为True,那么当目标地址中存在同名文件,并且文件比压缩包中的文件更新时,不进行覆盖。
- owner:文件或目录解压以后的所有者
- group: 文件或目录解压以后所属的群组
- mode: 文件或目录解压以后的权限
命令模块
command
作用:在远程主机上执行命令。(默认模块)
参数:
- creates:文件名,当该文件存在时,则不执行后面的命令
- chdir:执行命令前,先修改当前路径
- removes:文件名,当文件不存在时,则不执行后面的命令
- executable:切换shell来执行命令,该执行路径必须是一个绝对路径
shell
作用:和command模块相同,参数也相同。
使用:
# command,shell,raw,script模块同属于commands类,都是用来执行命令,不同的是:
- command模块执行的命令中不能包含:|,<,>,& 符号。
- shell模块:可以执行远程服务器上的shell脚本文件,也支持 管道符等,脚本需要使用绝对路径。
- raw模块和shell模块相同,可以执行任意命令就像在本机一样,相当于ssh之直接执行Linux命令,不会进入到ansible的模块子系统中。
- script模块,用来执行一个shell脚本,其实将管理端的shell脚本copy到被管理端上然后执行,相当于 scp + shell 的组合。(需要在脚本所在目录下执行)
# 官方建议使用command模块,如果需求不满足,可以使用raw模块
网络工具模块
get_url
作用:从互联网下载数据到本地,作用类似于Linux下的curl命令。
# 参数
- url:必传参数,文件的下载地址
- dest:必传参数,文件保存的绝对路径
- mode:文件的权限mode
- othes:所有file模块里的选项都可以在这里使用
- checksum:文件的校验码
- headers:传递给下载服务器的 HTTP Headers
- backup:如果本地已经存在同名的配置文件,先行备份
- timeout:下载的超时时间
包管理模块
apt
作用:这个模块是ubuntu作为远端节点的OS的时候,用的最多的。ubuntu/debian的包管理工具。
参数:
cache_valid_time : 如果update_cache 参数起作用的时候,这个参数才会起作用。其用来控制update_cache的整体有效时间
deb: 这个用于安装远程机器上的.deb后缀的软件包
default_release: 等同于apt命令的-t选项,这里就不多说了
force : 强制执行apt install/remove
install_recommends :这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候光下载软件包,不安装
name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
purge: 如果state参数值为absent,这个参数为yes的时候,将会强行干净的卸载
state: present latest/absent/present 定义软件包的最终状态,latest时为安装最新软件
update_cache : 当这个参数为yes的时候等于apt-get update
upgrade: yes/safe/full/dist如果参数为yes或者safe,等同于apt-getupgrade如果是full就是完整更新。如果是dist等于apt-get dist-upgrade。
使用方式:
# 在安装foo软件包前更新然后安装foo
- apt: name=foo update_cache=yes
# 移除foo软件包
- apt: name=foo state=absent
# 安装foo软件包
- apt: name=foo state=present
# 安装foo 1.0软件包
- apt: name=foo=1.00 state=present
# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新
- apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下载openjdk-6-jdk最新的软件包,不安装
- apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安装所有软件包到最新版本
- apt: upgrade=dist
# 更新apt-get的list
- apt: update_cache=yes
# 3600秒后停止update_cache
- apt: update_cache=yes cache_valid_time=3600
# 安装远程节点上的/tmp/mypackage.deb软件包
- apt: deb=/tmp/mypackage.deb
yum
作用:使用yum包管理软件包,跟apt类似
参数:
- config_file:yum的配置文件
- disable_gpg_check: 关闭gpg_check
- disablerepo: 不启用某个源
- enablerepo:启用某个源
- list:列出repo源
- name:软件包的名称,可以为一个url路径,或者本地一个rpm包的路径
- state:状态
=present:表示确保软件包已经安装,默认值
=installed:表示确保软件包已经安装,等效present
=latest:表示安装软件的最新版本
=absent:表示删除对应的软件包
=removed:等效absent
使用方式:
ansible test -m yum -a 'name=httpd state=installed' -k # yum 安装 httpd
yum_repository
作用:添加或删除yum仓库
参数:
name:必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl:此参数用于设置 yum 仓库的 baseurl。
description:此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file:此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中可以存在多个 yum 源。
enabled:此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck:此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey:当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state:默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。
源代码管理模块
git
作用:在远程服务器上执行git相关操作。依赖于git命令,需要在远程主机上先进性安装。
参数:
- repo:远程git库的地址,可以是一个git协议,ssh协议或者http协议的git库地址
- dest:必选参数,git库clone到本地服务器以后保存的绝对路径
- version:克隆远程git库的版本,取值可以为HEAD,分支名称,tag的名称,也可以是一个commit的hash值
- foces:默认为no,当该选项为yes时,如果本地git库有修改,将会抛弃本地的修改(强制覆盖)
- accept_hostkey: 当该选项取值为yes时,如果git库服务器不再know_hosts中,则添加到know_hosts中,key_file指定克隆远程git库地址时使用的私钥。