语法

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配置

一般流程

  1. 编辑/etc/ansible/hosts
  2. 添加本机的public SSH key到目标机器的authorized_keys   #ssh-copy-id
  3. 添加本机的私钥到Ansible所
  4. 运行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库地址时使用的私钥。 

星霜荏苒 居诸不息