1 介绍和部署 1.1 介绍
ansible的功能
批量系统配置
批量软件部署
批量文件拷贝
批量运行命令 2.ansible的角色
管理端:不需要启动任何服务,默认服务端不需要任何的配置
受控端:基于ssh免秘钥,没有客户端软件需要安装 3.ansible命令 Ansible 命令是一种强大的自动化工具,它允许系统管理员和开发者在多台机器上自动执行任务。其中,Ad-Hot模式是一个概念性的名称,它与编写Ansible playbook的概念相似,类似于直接在命令行输入shell命令与编写shell scripts之间的关联。 1. Ansible 匹配的资产主机:这是你希望在其上执行任务的目标机器或一组机器。 2. 使用的模块 -m:这是你希望执行的具体动作或任务,Ansible提供了许多预定义的模块以供选择。 3. 模块的参数 -a:这允许你为特定模块传递参数,以便进一步定制其行为。 Ad-Hoc 命令的基本格式如下: ansible [pattern] -m [module] -a '[module arguments]' [options]其中:
[pattern]:用来匹配目标主机或主机组的模式。
-m [module]:指定要使用的模块。
-a '[module arguments]':指定模块的参数。
[options]:其他可选参数。 详细解释一些常用的选项:
-a 'Arguments', --args='Arguments': 指定模块的参数。
-m NAME, --module-name=NAME: 指定要执行的模块名。默认使用 command 模块,所以如果只是执行单一命令,可以省略 -m 参数。
-u Username, --user=Username: 指定执行远程命令的用户,默认使用当前用户。
-U, --sudo-user=SUDO_User: sudo 到哪个用户,默认为 root。
-k, --ask-pass: 提示输入 SSH 密码,而不是假设基于密钥的验证。
-K, --ask-sudo-pass: 提示输入 sudo 密码。
-s, --sudo: 使用 sudo 运行命令。
-S, --su: 使用 su 命令运行命令。
-f NUM, --forks=NUM: 指定并行任务数,默认为 5。
--private-key=PRIVATE_KEY_FILE: 指定私钥文件的路径,用于 SSH 连接验证。
-v, --verbose: 输出详细信息。
all: 针对 hosts 文件中定义的所有主机执行命令。
-M MODULE_PATH, --module-path=MODULE_PATH: 指定模块的搜索路径。
-o, --one-line: 压缩输出,尝试将输出信息压缩到一行中显示。
-B SECONDS, --background=SECONDS: 在后台运行命令,并指定超时时间。
-P NUM, --poll=NUM: 在后台模式下,每隔多少秒检查一次作业状态。
-T SECONDS, --timeout=SECONDS: 设置命令执行的超时时间。
-c CONNECTION, --connection=CONNECTION: 指定连接类型,如 paramiko (SSH)、ssh 或 local。
--tags=TAGS: 只执行指定标签的任务。
--list-hosts: 只打印将执行 playbook 的主机列表,并不真正执行 playbook。
--list-tasks: 列出 playbook 中所有将被执行的任务。
-C, --check: 只测试命令会改变什么内容,而不会真正执行。
--syntax-check: 检查 playbook 的语法,但不执行。
-l SUBSET, --limit=SUBSET: 进一步限制所选主机或主机组。
--skip-tags=SKIP_TAGS: 跳过标签匹配的任务。
-e EXTRA_VARS, --extra-vars=EXTRA_VARS: 设置额外的变量。 1.2 ansible软件安装部署
环境规划 主机名IP地址用途master01 10.0.0.61 管理段 backup 10.0.0.41 受控端 nfs01 10.0.0.31 受控端 web01 10.0.0.7 受控端
免秘钥配置 分发秘钥 sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.7 sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.41免交互批量分发秘钥参考我的批量免秘钥分发脚本 要先按装了ansibl软件,才会有该配置文件
安装ansible 若受控主机有启用selinux,会影响ansible链接,在不能禁用的情况下,客户机可以安装以下程序 yum install -y libselinux-python
主机列表创建 cp /etc/ansible/hosts{,.bak} cat >/etc/ansible/hosts <<"EOF" [noah] 172.16.1.7 172.16.1.31 172.16.1.41 EOF 1.3 用法说明
语法 ansible 主机信息 -m 模块名称 -a "相关模块参数"" 主机信息:远程主机IP地址,主机组名称,all代表所有主机 -m:指定使用哪个模块 -a:模块中的参数和功能ping模块 [root@xxxx ~]# ansible all -m ping 172.16.1.41 | SUCCESS => { "changed": false, "ping": "pong" } 172.16.1.7 | SUCCESS => { "changed": false, "ping": "pong" } 172.16.1.31 | SUCCESS => { "changed": false, "ping": "pong" } ping模块没有参数,不用跟-e
绿色:查看远程主机信息,不会对远程主机系统做任何修改
红色:执行操作出现异常错误
黄色:对远程主机系统进行修改操作
粉色:警告或者忠告信息 其它示例: 以 root 用户身份对所有主机执行 df -h 命令: ansible all -m command -a "df -h" --become --become-user root使用 yum 模块安装 nginx,并提示输入密码: ansible webservers -m yum -a "name=nginx state=present" -k以 john 用户身份对 appservers 主机组执行 uptime 命令,并限制并发数为 5: ansible appservers -m command -a "uptime" -u john -f 5重启 testhosts 组的所有机器,每次重启 10 台: ansible testhosts -a "/sbin/reboot" -f 10使用额外的变量执行 playbook: ansible-playbook update.yml --extra-vars "hosts=vipers user=admin"只对这个两个 IP 执行任务: ansible [pattern] -m [module] -a '[module arguments]' --limit=192.168.0.10,192.168.0.11ansible常用命令解释 ansible-doc # ansible-doc -h Usage: ansible-doc [options] [module...] 该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下: //列出所有已安装的模块 # ansible-doc -l //查看具体某模块的用法,这里如查看command模块 # ansible-doc -s commandansible-galaxy # ansible-galaxy -h Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ... ansible-galaxy指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip ansible-playbook 通过读取playbook 文件后,执行相应的动作, ansible-pull 该指令使用需要谈到ansible的另一种模式---pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间; ansible-vault ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 –ask-vault-pass参数,同样需要输入密码后才能正常执行。具体该部分可以参看官网 2 命令类常用模块ansible模块列表
官方链接:
常用参数: free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行某个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行
举例
chdir参数 [root@xxxx ~]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /tmp
creates参数 [root@xxxx ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.conf exists [root@xxxx ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup
removes参数 [root@xxxx ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup [root@xxxx ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.1212213123 does not exist 2.2 shell[万能模块]
官方链接
常用参数 free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行莫个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行
举例 [root@xxxx ~]# ansible 172.16.1.41 -m shell -a "hostname;pwd" 172.16.1.41 | SUCCESS | rc=0 >> backup /root可以使用该名模,执行所有linux的命令,所以叫万能模块 2.3 script[脚本模块]
官方连接
常用参数 free_form [必须]表示执行command模块时,必须要有linux合法命令信息,如ls chdir 在执行莫个命令前,先切换目录 creates 判断一个文件是否存在,如果已经存在了,后面的命令就不会执行 removes 判断一个文件是否存在,如果不存在,后面的命令就不会执行
举例
先查看脚本 [root@xxxx ~]# cat /server/scripts/mk.sh #!/bin/sh mkdir -p /root/abc/def touch /root/abc/123.txt ls -lh /root/abc/*
在调用这个脚本远程执行 [root@xxxx ~]# ansible 172.16.1.7 -m script -a "/server/scripts/mk.sh" 172.16.1.7 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.7 closed.\r\n", "stdout": "-rw-r--r-- 1 root root 0 6月 18 17:05 /root/abc/123.txt\r\n\r\n/root/abc/def:\r\n总用量 0\r\n", "stdout_lines": [ "-rw-r--r-- 1 root root 0 6月 18 17:05 /root/abc/123.txt", "", "/root/abc/def:", "总用量 0" ] } 3 文件类常用模块 3.1 copy[复制模块]
官方链接:
常用参数 backup 对数据信息进行备份 src 定义要推送数据信息 dest [必须]定义将数据推送到远程主机什么目录中 owner 设置复制后的文件属主权限 group 设置复制后的文件属组权限 mode 设置复制后的文件权限(600 755)
举例
backup参数 ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/ backup=yes"
src,dest参数 ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/" 3.2 file[文件操作模块]
官方链接
常见参数 src 定义要推送数据信息 dest [必须]定义将数据推送到远程主机什么目录中 owner 设置文件属主权限 group 设置文件属组权限 mode 设置文件权限(600 755) state 用于指定创建目录或文件
举例
权限参数 ansible 172.16.1.7 -m file -a "dest=/tmp/01.txt owner=oldboy group=oldboy mode=600"
state创建文件 ansible 172.16.1.41 -m file -a "dest=/tmp/02.txt state=touch"
state创建目录 ansible 172.16.1.41 -m file -a "dest=/tmp/01dir state=directory" 4 包管理.系统服务管理.定时任务模块 4.1 yum[包管理模块]
官方链接
常用参数 name [必须]执行要安装软件的名称,以及软件的版本 state installed安装 absent(卸载) list 指定软件名称,查看软件是否可以安装,以及是否安装过
举例 ansible 172.16.1.41 -m yum -a "name=iftop state=installed" ansible 172.16.1.41 -m yum -a "name=iftop state=absent" ansible 172.16.1.41 -m yum -a "list=iftop" 4.2 service[系统服务管理模块]
官方链接
常用参数 name [必须]指定要管理的服务名称(管理的服务一定在chkconfig中可以看到) state stopped started restarted reloaded enabled yes表示服务开机自启动 no表示服务开机不要自动启动
举例 ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes" 4.3 cron[定时任务模块]
官方链接
常用参数 minute 分,写法同系统定时任务,如[0-59] [*] [*/n] hour 时,写法同上 day 日,写法同上 month 月,写法同上 weekday 周,写法同上 job 执行命令,如job='/bin/sh /server/scripts/test.sh &>/dev/null'
举例
添加定时任务 ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
删除定时任务 ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent" ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"
注释定时任务 ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"a ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/n (责任编辑:) |