优点
- 相比于saltatack和puppet,没有客户端,更轻量级
- 只是一个工具,可以很容易实现分布式拓展
- 更强的远程执行命令
特点
- 模块化
- 支持自定义模块,可以用任何语言编写模块
- 基于python语言实现
- 部署简单,基于python和ssh,agentless,无需代理
- 安全
安装
yum安装
首先安装epel源:yum install epel-release -y
下载ansible:yum install ansible
ansible目录结构
[root@bogon ansible]# tree . ├── ansible.cfg ├── hosts └── roles └── role_httpd.yml
ansible.cfg:主配置文件,一般无需更改
hosts:主机清单,添加主机
roles:存放角色的目录
上面共有三个分组,使用时写上组名,一般格式为:ansible [组名] -m [模块名] -a [命令]
1 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2 加载自己的模块,如commond
3 通过ansible将对应的模块或者命令生成.py文件,并将文件传输到远程服务器
4 给文件增加x权限
5 执行并返回结果
6 删除文件,退出
./elasticsearch
执行结果
黄色:执行成功并且有修改
绿色:执行成功,没有改变
红色:执行失败
默认模块,不支持特殊符号,不支持变量 ansible test -m ping [root@bogon ~]# ansible test -m ping 192.168.199.155 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.199.150 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 代表执行成功,没有任何改变 ansible test -a "systemctl status nginx" #查看test组中主机的nginx运行情况
用shell执行命令,支持特殊符号,重定向符号,变量等操作 [root@bogon ~]# ansible test -m shell -a "echo 'helloddd' >> /data/a.txt" 192.168.199.155 | CHANGED | rc=0 >> 192.168.199.150 | CHANGED | rc=0 >> 这里使用commond模块显示黄色且没有报错,但是a.txt文件没有发生改变 [root@bogon ~]# ansible test -a "echo 'hellodaad' >> /data/a.txt" 192.168.199.155 | CHANGED | rc=0 >> hellodaad >> /data/a.txt 192.168.199.150 | CHANGED | rc=0 >> hellodaad >> /data/a.txt [root@bogon ~]# ansible test -m shell -a "echo 'helloddd' >> /data/a.txt" 192.168.199.155 | CHANGED | rc=0 >> 192.168.199.150 | CHANGED | rc=0 >> 使用shell模块后修改成功 [root@bogon data]# cat a.txt hello helloddd
在远端主机执行本地脚本 在远端执行本地nginx.sh脚本,判断远端主机的nginx服务是否启动
creates表示如果远端主机上有指定的问价,则不执行后面的脚本,如果没有,则执行指定的脚本,如图远端主机都有a.txt文件,所以不执行nginx.sh脚本
从本地主机复制文件到远端主机 src 本地文件路径 dest 目标主机路径 mode 设置权限 backup 备份源文件 #把本地的/opt/test.txt文件复制到远端/opt/test.txt中 [root@bogon opt]# ansible test -m copy -a "src=/opt/test.txt dest=/opt/test.txt" #把本地问价中的指定内容复制到远端主机的文件中,内容带上''(单引号) ansible test -m copy -a "content='6 删除文件' dest=/opt/test.txt"
与copy相反,从远端主机复制文件到本地主机 从远端主机中的复制文件到本地,生成以远端IP为名称的文件夹 [root@bogon opt]# ansible test -m fetch -a "src=/data/a.txt dest=/opt/" #结果为 [root@bogon opt]# cat 192.168.199.150/data/a.txt hello helloddd
设置文件属性 path 要设置的文件路径 recurse 递归 state状态:absent(删除) touch(创建) directory(指定创建的是目录) #在远端主机/opt/创建c.txt文件 [root@bogon opt]# ansible test -m file -a "path=/opt/c.txt state=touch" #在远端主机/opt/创建/data/目录 [root@bogon opt]# ansible test -m file -a "path=/opt/data/ state=directory" #在远端主机上床架软链接 [root@bogon opt]# ansible test -m file -a "src=/data/a.txt dest=/data/link-a.txt state=link"
copy=no将远程主机上的压缩包压缩到指定目录下 copy=yes将本地主机上的压缩包传到远端主机上并解压 src 源路径 dest 目标路径 mode 权限 #copy=no,在远端主机上解压压缩包到指定目录下 [root@bogon opt]# ansible test -m unarchive -a "src=/data/test.tar.gz dest=/opt/ copy=no" #copy=yes 把本地的压缩文件床送到远端主机并解压 [root@bogon opt]# ansible test -m unarchive -a "src=/opt/test.tar.gz dest=/opt/rh/ "
将远程主机下的文件路径打包 format 打包格式 owner 指定所属者 path: 指定路径 dest: 指定目标文件 #把远程目录下的文件或者目录打包到指定目录下 [root@bogon opt]# ansible test -m archive -a "path=/opt/data/ dest=/opt/a.tar.bz2"
主要修改,添加,删除主机的crontab定时任务 在远端主机上新建定时任务 [root@bogon ~]# ansible test -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.199.149 &>/dev/null' name="hahha" " 删除任务 ansible websrvs -m cron -a 'state=absent name=hahha'
在远端执行yum操作 present 下载 absent 删除 在远端主机上安装httpd服务 ansible websrvs -m yum -a 'name=httpd state=present' 安装
功能:实现远程管理服务的生命周期 enabled #开机启动 yes|no name #服务名称,必选项 runlevel #运行级别 state started stopped restarted reloaded 重启nginx服务 [root@bogon ~]# ansible test -m service -a "name=nginx state=reloaded" 停止nginx服务 ansible test -m service -a "name=nginx state=stopped"
与service类似
User:管理用户 # 关键参数 group # 属组 groups # 附加组 home # 设置家目录 name # 用户名 remove # 删除用户并删除用户的家目录 shell # 用户登录后的shell system # 系统用户 uid # 用户的id state #创建或删除 shell #制定用户shell环境 创建用户(自动创建用户组) ansible test -m user -a "name=test1"
用于收集远端主机的信息,如cpu,内存,磁盘 获取远端主机名 [root@bogon ~]# ansible test -m setup -a "filter=ansible_fqdn" 过滤信息 [root@bogon ~]# ansible test -m setup -a "filter=*mb"
远程管理目标主机的防火墙 开启端口443并且设置为开机启动 [root@bogon ~]# ansible test -m firewalld -a 'port=443/tcp permanent=no state=enabled'
将多个任务写在一个.yml结尾的文件中,使用ansible-playbiik执行 例一:在远端开mysql服务 [root@bogon ~]# cat test1.yml --- - hosts: test remote_user: root tasks: - name: start mysql service service: name=mysqld state=started
playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。相当于test组
可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户 在远端主机上执行任务时时切换到指定用户(用户必须存在且对文件具有一定权限) [root@bogon ~]# cat test1.yml --- - hosts: test become: yes become_user: test2 tasks: - name: add fiile command: echo "h" >> /opt/a.txt
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量 [root@bogon ~]# cat test3.yml --- - hosts: test remote_user: root tasks: - name: install httpd yum: name=httpd state=present
利用ansible-playboo在远端上安装nginx [root@bogon ~]# cat test2.yml --- - hosts: test remote_user: root tasks: - name: add group nginx user: name=nginx state=present - name: add user nginx user: name=nginx state=present group=nginx - name: Install Nginx yum: name=nginx state=present - name: web page copy: src=files/index.html dest=/usr/share/nginx/html/index.html - name: Start Nginx service: name=nginx state=started
定义: variable=value 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用"{{variable_name }}”才生效 ansible-playbook –e 选项指定 ansible-playbook test.yml -e "hosts=www user=xingyun" 系统变量 主机名相关变量: ansible_hostname: 目标主机的短主机名。 ansible_fqdn: 目标主机的完全限定域名(Fully Qualified Domain Name, FQDN)。 ansible_nodename: 与 ansible_hostname 类似,提供主机名。 操作系统和平台信息: ansible_os_family: 提供操作系统的家族名称,如Debian、RedHat、Windows等。 ansible_distribution: 操作系统的具体发行版名称,如Ubuntu、CentOS等。 ansible_distribution_version: 操作系统发行版的具体版本号。 ansible_architecture: 主机的架构,如"x86_64"或"arm64"。 网络信息: ansible_default_ipv4.address: 默认第一块网卡的IPv4地址。 ansible_all_ipv4_addresses: 包含主机所有IPv4地址的列表。 ansible_all_ipv6_addresses: 包含主机所有IPv6地址的列表。 用户和组信息: ansible_users: 列出目标主机的所有用户账户信息。 ansible_env.HOME: 当前用户的家目录。 文件和目录信息: ansible_selinux_python_present: 指示目标主机上是否安装了用于SELinux操作的python库。 服务状态信息: 使用ansible_service_mgr可以得知目标主机使用的服务管理器类型,如'systemd'、'sysvinit'等。 #使用系统变量新建一个以本地用户名命名的文文件 [root@bogon ~]# cat test1.yml --- - hosts: test remote_user: root tasks: - name: add a new file named by user file: path=/opt/{{ ansible_nodename }}.txt state=touch 自定义变量 在主机清单中定义变量 port是局部变量,port=82是组中的全局变量 [test] 192.168.199.150 port=81 192.168.199.155 [test:vars] port=82 命令行指定变量(优先级最高) [root@bogon ~]# ansible-playbook port=83 test1.yml 在yml文件中定义变量 [root@bogon ~]# cat test3.yml --- - hosts: test remote_user: root vars: - name1: httpd - name2: nginx tasks: - name: install httpd yum: name={{ name1 }} state=present - name: install nginx yum: name={{ name2 }} state=present 变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量
模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法 template功能:可以根据和参考模块文件,动态生成相类似的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级,目录结构如下示例: ./ ├── temnginx.yml └── templates └── nginx.conf.j2