ansible
作者:互联网
Ansible的功能及优点
远程执行: 批量执行远程命令,可以对多台主机进行远程操作 配置管理: 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停 3.事件驱动 通过Ansible的模块,对服务进行不同的事件驱动 比如: 1)修改配置后重启 2)只修改配置文件,不重启 3)修改配置文件后,重新加载 4)远程启停服务管理 4.管理公有云 通过API接口的方式管理公有云,不过这方面做的不如saltstack. saltstack本身可以通过saltcloud管理各大云厂商的云平台。 5.二次开发 因为语法是Python,所以便于运维进行二次开发。 6.任务编排 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署 7.跨平台,跨系统 几乎不受到平台和系统的限制,比如安装apache和启动服务 在Ubuntu上安装apache服务名字叫apache2 在CentOS上安装apache服务名字叫httpd 在CentOS6上启动服务器使用命令:/etc/init.d/nginx start 在CentOS7上启动服务器使用命令:systemctl start nginx
Ansible 的架构
1、连接插件connection plugins用于连接主机 用来连接被管理端 2、核心模块core modules连接主机实现操作, 它依赖于具体的模块来做具体的事情 3、自定义模块custom modules根据自己的需求编写具体的模块 4、插件plugins完成模块功能的补充 5、剧本playbookansible的配置文件,将多个任务定义在剧本中,由ansible自动执行 6、主机清单inventor定义ansible需要操作主机的范围 最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块 Ansible的执行流程 1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。 2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。 3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。 4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。安装Ansible
首先安装epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 如果本地有了 就可以直接安装 yum install -y ansible --version #ansible版本信息 -v #显示详细信息 -i #主机清单文件路径,默认是在/etc/ansible/hosts -m #使用的模块名称,默认使用command模块 -a #使用的模块参数,模块的具体动作 -k #提示输入ssh密码,而不使用基于ssh的密钥认证 -C #模拟执行测试,但不会真的执行 -T #执行命令的超时 查看Ansible版本及模块路径 [root@m01 ~]# ansible --version ansible 2.7.1 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] Ansible配置文件详解 [root@m01 ~]# cat /etc/ansible/ansible.cfg #inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件存放目录 #remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录 #local_tmp = ~/.ansible/tmp #本机的临时执行目录 #forks = 5 #默认并发数 #sudo_user = root #默认sudo用户 #ask_sudo_pass = True #每次执行是否询问sudo的ssh密码 #ask_pass = True #每次执行是否询问ssh密码 #remote_port = 22 #远程主机端口 host_key_checking = False #跳过检查主机指纹 log_path = /var/log/ansible.log #ansible日志 #普通用户提权操作 [privilege_escalation] #become=True #become_method=sudo #become_user=root #become_ask_pass=False Ansible Inventory /etc/ansible/hosts是ansible默认主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。Inventory文件中填写需要被管理的主机与主机组信息。 还可以自定义Inventory主机清单的位置,使用-i指定文件位置即可。 Ansible配置文件 Ansible配置文件 ANSIBLE_CONFIG # 变量中如果使用配置文件 优先级最高 这种方式了解 ./ansible.cfg # 如果配置文件在当前目录 则默认以当前目录为主 常用 /root/.ansible.cfg # 家目录下的隐藏文件 了解 /etc/ansible/ansible.cfg # 默认配置文件 常用Ansible语法使用
webs ansible需要指定主机清单中的主机 组还是单台主机 组: webs 包含了10.0.0.7 10.0.0.8 ansible webs -m ping 单台: 10.0.0.7 ansible 10.0.0.7 -m ping 所有: all ansible all -m ping -i ./hosts -i 指定hosts主机清单文件 对单台服务器执行一条命令 [root@m01 ~]# ansible 10.0.0.7 -m ping 10.0.0.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 对组执行一条命令 [root@m01 ~]# ansible webs -m ping 10.0.0.8 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"在配置文件中的配置
主机清单中的变量 [root@m01 ~]# cat /etc/ansible/hosts [webs] 10.0.0.7 10.0.0.8 [webs:vars] ansible_ssh_user='root' ansible_ssh_pass='1' ansible_ssh_port='22' 主机清单中客户端的变量 [root@m01 ~]# vim /etc/ansible/hosts [webs] web01 ansible_ssh_host=10.0.0.7 web02 ansible_ssh_host=10.0.0.8 [webs:vars] ansible_ssh_user='root' ansible_ssh_pass='1' ansible_ssh_port='22' 调用 [root@m01 ~]# ansible web01 -m ping web01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 主机清单基于秘钥的方式连接 常用 生成并推送秘钥 ssh-keygen ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7 ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8定义主机清单
[root@m01 ~]# cat /etc/ansible/hosts [webs] web01 ansible_ssh_host=10.0.0.7 web02 ansible_ssh_host=10.0.0.8 Ansible模块使用第一个模块: shell
shell模块 可以执行对应的shell命令 [root@m01 ~]# ansible webs -m shell -a 'ip add' [root@m01 ~]# ansible webs -m shell -a 'ls -l /tmp/ansible.txt'
第二个模块: command命令模块
[root@m01 ~]# ansible webs -m command -a 'ifconfig eth0'第三个模块: script 执行shell脚本
[root@m01 ~]# echo ls /tmp > 1.sh [root@m01 ~]# ansible webs -m script -a '1.sh' 安装 配置 启动 目录 文件 用户 授权 防火墙 selinux 挂载 数据库 [root@m01 ~]# ansible-doc 查看模块帮助信息 例如 [root@m01 ~]# ansible-doc yum # 查看yum的使用方式第四个模块: yum 模块
yum 模块 name 服务的名称 state 状态信息 present 安装仓库中存在的版本 latest 安装最新版本 absent 卸载 download_only: true 只下载不安装 通过帮助使用ad-hoc的方式书写 - name: install the latest version of Apache yum: name: httpd state: latest ad-hoc ansible webs -m yum -a 'name=httpd state=latest' # 安装最新的apache服务 ansible webs -m yum -a 'name=httpd state=absent' # 卸载apache服务第五个模块 copy模块 复制文件
copy: 模块 src: 源文件 dest: 拷贝到客户端的哪个位置 owner: 属主 group: 属组 mode: 权限 backup: 以时间命名方式备份客户端的文件 推送export到客户端web01 [root@m01 ansible]# ansible web01 -m copy -a 'src=./exports dest=/etc/exports owner=root group=root mode=0644' backup备份文件 [root@m01 ansible]# ansible web01 -m copy -a 'src=./exports dest=/etc/exports owner=root group=root mode=0644 backup=yes' 在客户端的/tmp目录下生成一个index.html文件 内容为web01 [root@m01 ansible]# ansible web01 -m copy -a 'content=web01 dest=/tmp/index.html'第六个模块: group 用户组
group: 模块 name: 组名 gid: 666 组ID号 state: present 创建 state: absent 删除组 [root@m01 ansible]# ansible web01 -m group -a 'name=www gid=666 state=present' web01 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "gid": 666, "name": "www", "state": "present", "system": false }第七个模块: user 用户
用户名 用户id 组id 是否创建家目录 是否可登陆 user: 模块名称 name: johnd 用户名称 uid: 1040 uid group: admin 属组 属于admin组 shell: /bin/bash 指定用户的bash state: present 创建 state: absent 删除用户 create_home: no 不创建家目录 创建www用户 uid gid为666 不允许登录 不创建家目录 [root@m01 ansible]# ansible web01 -m user -a 'name=www uid=666 group=www shell=/sbin/nologin create_home=no state=present'第八个模块: file 模块 创建文件或目录
file: 模块名称 path: /etc/foo.conf 创建文件或目录的路径 owner: foo 属主 group: foo 属组 mode: '0644' 权限 state: touch 创建普通文件 state: directory 创建目录 state: absent 删除目录 recurse=yes 递归创建目录 创建普通文件passwd [root@m01 ansible]# ansible web01 -m file -a 'path=/tmp/passwd state=touch' 删除普通文件passwd [root@m01 ansible]# ansible web01 -m file -a 'path=/tmp/passwd state=absent' 创建目录 [root@m01 ansible]# ansible web01 -m file -a 'path=/data state=directory' 递归创建www目录 [root@m01 ansible]# ansible web01 -m file -a 'path=/data/blog/www recurse=yes state=directory'小结: 8个模块
1.ping ansible webs -m ping
2.command ansible webs -m command -a '执行命令但是不支持管道'
3.shell ansible webs -m shell -a '可执行的shell命令支持管道'
4.script ansible webs -m script -a '/root/test.sh'
5.yum ansible webs -m yum -a 'name=httpd state=present' state=present 安装 latest 最新的 absent 卸载
6.copy ansible webs -m copy -a 'src=/etc/passwd dest=/root owner=www group=www mode=0644 backup=yes' content=123456 dest=/etc/passwd
7.group ansible webs -m group -a 'name=www gid=666'
8.user ansible webs -m user -a 'name=www uid=666 group=www shell=/bin/bash create_home=no state=present' 9.file ansible webs -m file -a 'path=/tmp/test.txt state=touch' ansible webs -m file -a 'path=/data/blog state=directory recurse=yes'
第十个模块: systemd 启动停止服务
systemd: 模块名称 name: httpd apache服务名称 state: started 启动服务 state: stopped 停止服务 state: restarted 重启服务 state: reloaded 重新加载服务 enabled: yes 开机自动运行第十一个模块: mount模块 挂载
mount: 模块名称 path: /mnt/dvd 挂载到哪个位置 src: /dev/sr0 挂载谁 挂载172.16.1.31的共享目录 fstype: iso9660 挂载类型 opts: defaults 挂载参数 state: present 不挂载只写入到开机自动挂载配置文件中/etc/fstab state: mounted 挂载并且自动加入到开机自动挂载配置文件中/etc/fstab state:unmounted 卸载但是不删除fstab中的配置 state: absent 卸载并且删除fstab中的配置 state: mounted 使用 state: absent 使用第十二个模块:get_url
get_url: 下载模块名称 url: http://example.com/path/file.conf 包的url地址 dest: /etc/foo.conf 下载到本地的位置 mode: '0440' 下载wordpress到本地的root目录 [root@m01 ansible]# ansible webs -m get_url -a 'url=https://wordpress.org/latest.tar.gz dest=/root/'第十三个模块: unarchive
unarchive: # 解压模块名称 src: foo.tgz # 解压的包名称 dest: /var/lib/foo # 解压到哪个目录下 remote_src=yes # 解压客户端上存在的压缩包第十四个模块: yum_repository
yum_repository: # yum源模块 name: epel # 仓库的名称 description: EPEL YUM repo # 描述 baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ # 仓库的地址 enabled: yes # 启动仓库 state: absent # 删除仓库 安装更新为YUM源 [root@m01 ansible]# ansible web01 -m yum_repository -a "name=base description='BASE YUM repo' baseurl=http://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/ enabled=yes" 安装下载扩展源 [root@m01 ansible]# ansible web01 -m yum_repository -a "name=epel description='EPEL YUM repo' baseurl=http://mirrors.aliyun.com/epel/7/\$basearch gpgcheck=no enabled=yes"第十五个模块: cron 定时任务模块
第十五个模块: cron 定时任务模块 cron: 定时任务模块 name: "check dirs" 定时任务注释信息 minute: "0" 分钟 hour: "5,2" 小时 job: "ls -alh > /dev/null" 任务具体执行的内容 state: present 添加 state: absent 删除 每5分钟执行一次时间同步 [root@m01 ansible]# ansible web01 -m cron -a 'name=ntpdate minute=*/5 hour=* job="ntpdate ntp1.aliyun.com &>/dev/null" state=present' 删除定时任务 [root@m01 ansible]# ansible web01 -m cron -a 'name=ntpdate minute=*/5 hour=* job="ntpdate ntp1.aliyun.com &>/dev/null" state=absent' 简写直接调用名称即可 [root@m01 ansible]# ansible web01 -m cron -a 'name=ntpdate state=absent' 关闭防火墙 [root@m01 ansible]# ansible web01 -m systemd -a 'name=firewalld state=stopped' [root@m01 ansible]# ansible web01 -m systemd -a 'name=firewalld state=stopped enabled=no' 关闭Selinux selinux: selinux模块 state: disabled 关闭selinux 修改客户端的selinux配置文件为disabled 但是重启服务器生效 [root@m01 ansible]# ansible web01 -m selinux -a 'state=disabled' 临时关闭使用ansible的shell或者command模块 [root@web01 ~]# setenforce 0标签:模块,state,ansible,web01,m01,root 来源: https://www.cnblogs.com/slx-yyds/p/15322066.html