ansible

目录

一、ansible

1.有网环境

2.无网环境

3.配置文件

4.主机清单

 二、常用命令

 三、ansible模块

1.command ---- 远程主机执行命令

 2.shell  支持shell特性的command

3.script ---- 运行shell脚本

 4.copy ---- 复制文件到远程主机

5.fetch ---- 从主机提取文件到主控端

6.file  设置文件属性

7.unarchive ---- 解压缩

8.archive ---- 压缩

9.yum ---- 软件包管理

10.corn ---- 定时任务

11.service ---- 管理服务

12.user ---- 管理用户

13.group ---- 管理用户组

14.lineinfile ---- 替换

15.replace ---- 替换

16.setup ---- 收集主机信息

四、playbook

五、roles


一、ansible

1.有网环境

yum -y install epel-release && yum -y install ansible
ansible --version

2.无网环境

yum install epel-release --downloadonly --downloaddir=/data/ansible
yum -y install epel-release
yum install ansible --downloadonly --downloaddir=/data/ansible

yum -y install epel*.rpm && yum -y install *.rpm

3.配置文件

ANSIBLE_CFG:首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件
./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件
~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件
/etc/ansible/ansible.cfg:最后,将会检查在安装Ansible时自动生产的配置文件
配置项 说明 默认值
inventory ansible inventory文件路径 /etc/ansible/hosts
library ansible模块文件路径 /usr/share/my_modules/
remote_tmp ansible远程主机脚本临时存放目录 ~/.ansible/tmp
local_tmp ansible管理节点脚本临时存放目录 ~/.ansible/tmp
forks ansible执行并发数 5
poll_interval ansible异步任务查询间隔 15
sudo_user ansible sudo用户 root
ask_sudo_pass 运行ansible是否提示输入sudo密码 True
ask_pass 运行ansible是否提示输入密码 True
transport ansible远程传输模式 smart
remote_port 远程主机SSH端口 22
module_lang ansible模块运行默认语言环境 C
gathering facts信息收集开关定义 smart
roles_path ansible role存放路径 /etc/ansible/roles
timeout ansible SSH连接超时时间 10
remote_user ansible远程认证用户 root
log_path ansible日志记录文件 /var/log/ansible.log
module_name ansible默认执行模块 command
executable ansible命令执行shell /bin/sh
hash_behaviour ansible主机变量重复处理方式 replace
private_role_vars 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 yes
vault_password_file 指定vault密码文件路径
ansible_managed 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 Ansible managed
display_skipped_hosts 开启显示跳过的主机 True
error_on_undefined_vars 开启错误,或者没有定义的变量 False
action_plugins ansible action插件路径
cache_plugins ansible cache插件路径
callback_plugins ansible callback插件路径
connection_plugins ansible connection插件路径
lookup_plugins ansible lookup插件路径
inventory_plugins ansible inventory插件路径
vars_plugins ansible vars插件路径
filter_plugins ansible filter插件路径
terminal_plugins ansible terminal插件路径
strategy_plugins ansible strategy插件路径
fact_caching 定义ansible facts缓存方式 memory
fact_caching_connection 定义ansible facts缓存路径

4.主机清单

/etc/ansible/hosts

配置项 说明
ansible_ssh_host 目标主机地址
ansible_ssh_port 目标主机端口,默认22
ansible_ssh_user 目标主机用户
ansible_ssh_pass 目标主机ssh密码
ansible_sudo_pass sudo密码
ansible_sudo_exe sudo 命令路径
ansible_connection 与主机的连接类型,比如:local,ssh或者paramiko
ansible_ssh_private_key_file 私钥地址
ansible_shell_type 目标系统的shell类型
ansible_python_interpreter python版本
vi /etc/ansible/hosts

[client1]
网络地址

[client2]
网络地址 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass="xxxx"
直接显示密码不安全

[client3]
网络地址 ansible_ssh_port=22

 二、常用命令

参数 说明
host-pattern 主机或者主机组
-f FORKS 并行任务数,默认为5
-m MODULE_NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-a MODULE_ARGS 模块的参数
-k,--ask-pass ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass ask for su password。su切换密码
-K,--ask-sudo-pass ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS 后台运行超时时间
-C 模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION 连接类型使用
-i INVENTORY 指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts 查看有哪些主机组
-o 压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S 用 su 命令
-R SU_USER 指定 su 的用户,默认为 root 用户
-s 用 sudo 命令
-U SUDO_USER 指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT 指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER 远程用户,默认为 root 用户
-v 查看详细信息,同时支持-vv,-vvv,-vvvv可查看更详细信息
ansible client3  -m ping

ansible client3  -m ping -k

ansible client2  -m ping 

ssh
exit

ansible client2  -m ping

添加known_hosts解决 ssh 需要输入yes问题
absible all -m ping

批量推公钥
ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -k

 三、ansible模块

1.command ---- 远程主机执行命令

使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效。

相关选项如下:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令,这里的free_form不需要写成赋值的形式,直接写要执行的命令即可,ansible -a代替
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径

ansible all -m command -a 'chdir=/data ls'

如果不存在/data目录 执行ls
ansible all -m command -a 'creates=/data ls'

如果存在/data目录 执行ls
ansible all -m command -a 'removes=/data ls'

只能执行简单命令,shell不执行
ansible all -m command -a ' ls | grep rc'

 2.shell  支持shell特性的command

在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)

查看所有主机boot分区的磁盘使用率
ansible all -m shell -a ' df -h | grep boot'

3.script ---- 运行shell脚本

实现远程批量运行本地的 shell 脚本

输入hello world到远程主机的/opt/test.txt文件中
echo 'echo "hello world" > /opt/test.txt ' > test.sh
ansible all -m script -a "test.sh"
ansible all -m command -a "cat /opt/test.txt"

 4.copy ---- 复制文件到远程主机

相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
owner    文件复制到远程并设定属主,默认为root
group    文件复制到远程并设定属组,默认为root
mode    文件复制到远程并设定权限,默认file=644,directory=755

复制本地的test.sh到远程主机,强制覆盖并备份
ansible client1 -m copy -a "src=/root/test.sh dest=/root/ backup=yes force=yes"
ansible client1 -m copy -a "content=/root/test.sh dest=/root/test.sh backup=yes force=yes"

5.fetch ---- 从主机提取文件到主控端

该模块用于从远程某主机获取(复制)文件到本地。有两个选项:
dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录

不指定 flat 会在dest指定目录下创建一个目录,以主机名命名
ansible client1 -m fetch -a "src=/root/test.sh dest=/root/ flat=yes"
ansible client1 -m fetch -a "src=/root/test.sh dest=/data/"
ls /data/

6.file  设置文件属性

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

在/data/目录下新建data目录并新建文件 1.txt 属主为mysql 属组为root,没有/data/data则新建
ansible client1 -m file -a 'path=/data/data/1.txt owner=mysql group=root state=directory'
ansible client1 -m command -a "ls -l /data/data"

7.unarchive ---- 解压缩

用于解压文件,模块包含如下选项:
copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
creates:指定一个文件名,当该文件存在时,则解压指令不执行
src:如果copy为yes,则需要指定压缩文件的源路径
dest:远程主机上的一个路径,即文件解压的路径
owner:解压后文件或目录的属主
group:解压后的目录或文件的属组
mode:解压后文件的权限
list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
打包本机/data目录,上传到远程主机并解压
tar cfP data.tar.gz /data
ansible client1 -m unarchive -a 'src=/root/data.tar.gz dest=/data copy=yes'

8.archive ---- 压缩

path    远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest    打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format    指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner    指定属主
group    指定属组
mode    指定权限
remove    yes|no,默认为no,在打包/压缩后,不删除源文件。

压缩/data/data目录,并删除/data/data目录下文件
ansible client1 -m archive -a 'path=/data/data dest=/data/data.gz format=gz remove=yes'

9.yum ---- 软件包管理

name               所安装的包的名称
state              present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache       强制更新yum的缓存
conf_file          指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check  是否禁止GPG checking,只用于presentor latest。
disablerepo        临时禁止使用yum库。 只用于安装或更新时。
enablerepo         临时使用的yum库。只用于安装或更新时

安装最新的httpd
ansible client1 -m yum -a 'name=httpd state=latest'

卸载httpd
ansible client1 -m yum -a 'name=httpd state=absent'

10.corn ---- 定时任务

day               日应该运行的工作( 1-31, *, */2, )
hour              小时 ( 0-23, *, */2, )
minute            分钟( 0-59, *, */2, )
month             月( 1-12, *, /2, )
weekday           周 ( 0-6 for Sunday-Saturday,, )
job               指明运行的命令是什么
name              定时任务描述
reboot            任务在重启时运行,不建议使用,建议使用special_time
special_time      特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state             指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user              以哪个用户的身份执行
 

每分钟同步一次aliyun时间服务器
ansible client1 -m cron -a 'name="ntpdate time" minute="*/1" job="ntpdate ntp1.aliyun.com"'

查看定时任务
ansible client1 -m command -a ' crontab -l'


ansible client1 -m command -a ' crontab -l'

11.service ---- 管理服务

enabled         设置开机启动。
name            服务名称
runlevel        开机启动的级别,一般不用指定。
sleep           在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state           有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置

启动nginx,并加入开机自启
ansible client1 -m service -a 'name=nginx state=started enabled=yes '

12.user ---- 管理用户

comment         用户的描述信息
createhome      是否创建家目录
force           在使用state=absent时, 行为与userdel –force一致.
group           指定基本组
groups          指定附加组,如果指定为(groups=)表示删除所有组
home            指定用户家目录
move_home       如果设置为home=时, 试图将用户主目录移动到指定的目录
name            指定用户名
non_unique      该选项允许改变非唯一的用户ID值
password        指定用户密码,使用 SHA512 hash
remove          在使用state=absent时, 行为是与userdel –remove一致
shell           指定默认shell
state           设置帐号状态,不指定为创建,指定值为absent表示删除
system          当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid             指定用户的uid
update_ password 
  always      如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
  on_create   如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
创建一个用户es,不创建家目录
ansible client1 -m user -a 'name=es createhome=no'

13.group ---- 管理用户组

gid       设置组的GID号
name      指定组的名称
state     指定组的状态,默认为创建,设置值为absent为删除
system    设置值为yes,表示创建为系统组

创建test组
ansible client1 -m group -a 'name=test gid=1005'

删除test组
ansible client1 -m group -a 'name=test gid=1005 state=absent'

14.lineinfile ---- 替换

path            指定要操作的文件
regexp            使用正则表达式匹配对应的行
line            修改为新的内容
insertafter        将文本插入到“指定的行”之后
insertbefore    将文本插入到“指定的行”之前
state            删除对应的文本时,需要state=absent
backrefs        1.支持后向引用、2.当未匹配到内容则不操作文件
backup            是否在修改文件之前对文件进行备份
create            当要操作的文件并不存在时,是否创建对应的文件

创建文件,并插入hello
ansible client1 -m lineinfile -a 'path=/data/2.txt line="hello"  create=yes'

在hello后面插入world
ansible client1 -m lineinfile -a 'path=/data/2.txt line="world" insertafter="hello"'

将hello替换成world
ansible client1 -m lineinfile -a 'path=/data/2.txt line="world" regexp="hello"'

15.replace ---- 替换

path        必须参数,指定要修改的文件,2.3版本之前,这个参数叫dest、destfile、name;现在这三个名称是path参数的别名
regexp      必须参数,指定一个正则表达式,可以是python正则
replace     替换regexp参数匹配到的字符串,
owner       结果文件或目录的所属用户名,相当于chown命令修改
group       结果文件或目录的所属组名,相当于chown命令修改
mode        结果文件或目录的权限,与chmod命令不一致的是,replace模块的mode参数需要添加前导零,以便ansible的YAML解析器知道它是八进制;1.8版本后可以设置为符号模式(u+rwx或u=rw),2.6版本后可以是特殊字符串(preserve),当设置为’preserve’时,文件将被赋予与源文件相同的权限。
others      可以指定file模块的所有参数
encoding    用于读取和写入文件的字符编码
before      如果指定,则仅替换/删除此匹配之前的内容,可以和after参数结合使用
after       如果指定,则仅替换/删除此匹配之后的内容,可以和before参数结合使用
attributes  结果文件或目录的特殊属性,相当chattr,默认使用=运算符,指定文件或目录的某项属性
backup      修改源文件前创建一个包含时间戳信息的备份文件

将文件中的 wo 字符 替换成 he
ansible client1 -m replace -a 'path=/data/2.txt regexp="wo" replace="he"'

16.setup ---- 收集主机信息

ansible test -m setup   获取全部信息
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息
选项:filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
常用的过滤关键词:
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 client1 -m setup -a 'filter=ansible_hostname'

四、playbook

name            唯一id,用来标识这个play主要用来干什么
hosts            列出这个play会在远程的哪些host上执行
remote_user        指定远程host执行用户
become_method    用于指定切换账号时使用的特权账号,如su和sudo
become            用于设置是否切换账号运行,如果没有设置become_method,则使用sudo进行账号切换
become_user        用于指定使用sudo进行账号切换时具体切换到哪个账号,使用这个参数时需要become为true,对于become_method可设置也可不设置,如果不设置,使用默认的sudo账号进行账号切换
ignore_errors    用于控制当play中的某一个task执行失败时,是否继续执行后面的task
pre_tasks        用于指定在roles定义的tasks之前执行的tasks,具体可参考ansible playbook play执行顺序
roles            列出这个play会引入哪些roles,可与pre_tasks,post_tasks和tasks一起控制play执行顺序
post_tasks        用于指定所有task执行之后的任务,跟pre_tasks一样也可以用来控制执行顺序
tasks             用于指定一系列要执行的task列表,跟pre_tasks, post_tasks和roles一起控制play执行顺序
run_once        用于控制对于相同的host是否对相同任务执行多次,默认是false
timeout           设置每个task最多执行时间,超时则task执行失败,返回错误
vars             使用Dictionary格式定义play级别变量,可参考ansible变量详解
vars_files        引入包含当前play变量的文件列表
gather_facts    设置是否需要收集远程host的fact变量结果
handlers        被tasks调用的任务列表

安装nginx,使用nginx1启动worker进程,开机自启,打包nginx目录,创建定时时间同步的任务

五、roles

roles:      <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
project:    <---具体的角色项目名称,比如nginx、tomcat、php
files:     <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks:     <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
  main.yml
handlers:  <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
  main.yml
vars:      <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
  main.yml
defaults:  <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
  main.yml
meta:      <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
  main.yml

你可能感兴趣的:(服务器,ansible,linux,centos)