设为首页 收藏本站
查看: 1280|回复: 0

[经验分享] Linux服务之ansible自动化

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-10 08:48:10 | 显示全部楼层 |阅读模式
1、初步介绍
Ansible是一个彻底的简单的配置管理、应用部署、任务执行和多节点编制引擎。设计原则有一个死去的简单的安装过程和最小的学习曲线是非常快和并行默认不需要服务器或客户端守护进程,使用现有的SSHd使用一种语言,是机器和人类友好容易专注于安全审核/审查/修改的内容立即管理远程机器,没有在任何动态语言引导允许模块开发,不仅Python作为非根可用最简单的自动化系统使用。
在管理服务器的时候对于数量较少的时候还比较轻松。但是如果一旦服务器数量过多那么管理就会很吃力。而ansible的出现能够很好的满足需能够很好解决问题。
2、进一步解析ansible
2.1、结构图如下
QQ截图20151210084748.png


2.2、对于ANSIBLE来说需要在服务器上进行部署想关进程才能对其划分的服务器进行管理。
而安装程序需要的安装有如下几个
[iyunv@localhost ~]# rpm -qa ansible
ansible-1.9.2-1.el7.noarch
如果是手动编译安装需要解决其依赖关系其需要的依赖包如下
python-jinja2
PyYAML
python-paramiko
python-babel
python-crypto
2.3、ANSIBLE主要的一些配置文件
[iyunv@localhost ~]# rpm -ql ansible | less
/etc/ansible
/etc/ansible/ansible.cfg——ansible主配置文件
/etc/ansible/hosts——定义需要的控制服务器的ip地址或者服务器名
/etc/ansible/roles——定义需要角色
/usr/bin/ansible-doc——ansible需要的帮助文档
/usr/bin/ansible-playbook——执行剧本
/usr/bin/ansible-vault——ansible库文件
对于ansible而言所有的配置文件都在ansible目录下面。
2.4、对于ansible而言在操作之前需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。如下的操作
[iyunv@wp ~]# ssh-keygen ——对于弹出来的界面回车到结束即可
[iyunv@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.1
[iyunv@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.22
把所有的需要管理的服务器统一添加都群组中去。
2.5、ansible简单的操作如下
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
[iyunv@localhost ~]# ansible-doc -s
Usage: ansible-doc [options] [module...]
Options:
  -h, --help            show this help message and exit
  -l, --list            List available modules
  -s, --snippet         Show playbook snippet for specified module(s)
  -v                    Show version number and exit
[iyunv@localhost ~]#
3、ansible具体介绍
3.1、对其主配置文件进行说明
[iyunv@node1 ~]# vim /etc/ansible/ansible.cfg
[defaults]
inventory      = /etc/ansible/hosts——默认用户存放文件
#library        = /usr/share/my_modules/——ansible默认模块
remote_tmp     = $HOME/.ansible/tmp
pattern        = *——全局匹配
forks          = 5——分叉五次
poll_interval  = 1——投票间隔
sudo_user      = root——默认以root用户设置
#remote_port    = 22——默认远程端口
sudo_exe = sudo——以sudo的方式执行执行权限
timeout = 10——ssh连接超时10s

[iyunv@localhost ~]# vim /etc/ansible/hosts
[keep]定义ansible组
172.16.17.1
172.16.17.3
[httpd]
172.16.17.4
172.16.17.5
3.2、对于ansible而言除了能够单个命令执行还可以定义剧本一次执行。
第二部分、接下说说ansible常用模块
1、Setup
收集远程主机的服务器的基本信息
Ansible  HOSTS  -m setup
2、File 设置文件的一些常用属性
[iyunv@localhost ~]# ansible-doc -s  file
force需要在两种情况下强制创建软链接一种是源文件不存在但之后会建立的情况下另一种是目标软链接已存在,需要先取消之前的软链然后创建新的软链有两个选项yes|no
group定义文件/目录的属组
mode定义文件/目录的权限
owner定义文件/目录的属主
path必选项定义文件/目录的路径
recurse递归的设置文件的属性只对目录有效
src要被链接的源文件的路径只应用于state=link的情况
dest被链接到的路径只应用于state=link的情况
state指定需要实现的状态状态有如下的这些
directory如果目录不存在创建目录
file即使文件不存在也不会被创建
link创建软链接
hard创建硬链接
touch如果文件不存在则会创建一个新的文件如果文件或目录已存在则更新其最后修改时间
absent删除目录、文件或者取消链接文件
例子
     ansible nginx -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'
     ansible nginx -m file -a 'path=/tmp/test.sh state=touch'
     ansible nginx -m shell -a 'echo "hell world" > /tmp/test.sh'
     ansible nginx -m file -a 'path=/tmp/test1 state=directory mode=744'
3、command 在控制的服务器中执行命令
      chdir       # 在运行某个目录下的命令之前先切换到目录下
      creates     # 如果创建的文件存在即退出不创建
      executable  # 以shell的方式执行命令但是需要时绝对路径的前提下
      removes    # 移除某个文件但是如果不存在就不执行
例子
[iyunv@localhost ~]# ansible nginx -m command -a 'date'
172.16.17.1 | success | rc=0 >>
Thu Oct 22 00:51:39 CST 2015
172.16.17.22 | success | rc=0 >>
Thu Oct 22 00:51:39 CST 2015
4、user   添加用户
[iyunv@localhost ~]# ansible-doc -s user
      createhome    除非设置为“不”,一个主目录将为用户创建账户时或者主目录不存在。
      force         当状态 为absent就如使用 `userdel --force'一样
      generate_ssh_key  是否产生问题中的用户的SSH密钥。这将不会覆盖现有的SSH密钥。                                   
      groups       列出所有用户组当 groups=空的时候把附加组都删除
      home        给用户创建家目录
      move_home  修改用户的家目录
      name=       创建删除修改时候需要的指定用户  
      password     给用户添加一个秘密
      remove      删除用户相当于`state=absent',
      shell         指定拥护采用的shell格式   
      state        无论该帐户是否存在如果该状态与所述状态不同则采取行动。
      system      创建系统用户
      uid         指定拥护UID
      update_password     更改秘密
需要特别说明的是password后面指定的密码不能是明文后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中而登陆的时候输入的密码会被hash加密以后再去与/etc/shadow中存放的密码去做对比会出现不一致的现象。所以需要先将密码字符串进行加密处理openssl passwd -salt -1 "123456"然后将得到的字符串放到password中即可。
5、group 用户组管理
      gid         指定用户组GUD
      name=      指定用户组名
      state        该组是否应该在远程主机上
      system     创建用户组
6、cron 远程客户端执行任务计划
      backup      在创建新的crontab任务之前对其之前创建的进行备份
      cron_file     如果确定使用这个文件使用使用cron。D而不是单个用户的crontab。
      day         # Day of the month the job should run ( 1-31, *, */2, etc )
      hour        # Hour when the job should run ( 0-23, *, */2, etc )
      job         # The command to execute. Required if state=present.
      minute      # Minute when the job should run ( 0-59, *, */2, etc )
      month      # Month of the year the job should run ( 1-12, *, */2, etc )
      name=      # Description of a crontab entry.
      state        # Whether to ensure the job is present or absent.
      user        # The specific user whose crontab should be modified.
      weekday    # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
例子
[iyunv@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=present minute=*/3 job="/bin/cat /etc/issue &> /dev/null"'
[iyunv@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=absent '
7、copy 复制文件
     复制文件到远程主机
copy模块包含如下选项
backup在覆盖之前将原文件备份备份文件包含时间信息。有两个选项yes|no
content用于替代"src",可以直接设定指定文件的值
dest必选项。要将源文件复制到的远程主机的绝对路径如果源文件是一个目录那么该路径也必须是个目录
directory_mode递归的设定目录的权限默认为系统默认权限
force如果目标主机包含该文件但内容不同如果设置为yes则强制覆盖如果为no则只有当目标主机的目标位置不存在该文件时才复制。默认为yes
others所有的file模块里的选项都可以在这里使用
src要复制到远程主机的文件在本地的地址可以是绝对路径也可以是相对路径。如果路径是一个目录它将递归复制。在这种情况下如果路径使用"/"来结尾则只复制目录里的内容如果没有使用"/"来结尾则包含目录在内的整个内容全部复制类似于rsync。
示例
ansible test -m copy -a "src=/etc/issue  dest=/tmp/issue  owner=root group=root mode=0644"
ansible nginx -m copy -a 'src=/etc/issue dest=/tmp/issue backup=yes'
8、ping 测试网络使用的
[iyunv@localhost ~]# ansible nginx  -m ping   
172.16.17.1 | success >> {
    "changed": false,
    "ping": "pong"
}
172.16.17.22 | success >> {
    "changed": false,
    "ping": "pong"
}
9.shell
切换到某个shell执行指定的指令参数与command相同。
示例
ansible test -m shell -a "somescript.sh >> somelog.txt"

10.service
用于管理服务
该模块包含如下选项
arguments给命令行提供一些选项
enabled是否开机启动 yes|no
name必选项服务名称
pattern定义一个模式如果通过status指令来查看服务的状态时没有响应就会通过ps指令在进程中根据该模式进行查找如果匹配到则认为该服务依然在运行
runlevel运行级别
sleep如果执行了restarted在则stop和start之间沉睡几秒钟
state对当前服务执行启动停止、重启、重新加载等操作started,stopped,restarted,reloaded
示例
ansible test -m service -a "name=httpd state=started enabled=yes"
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"
11.filesystem
在块设备上创建文件系统
选项
dev目标块设备
force在一个已有文件系统的设备上强制创建
fstype文件系统的类型
opts传递给mkfs命令的选项
12.yum
使用yum包管理器来管理软件包
选项
config_fileyum的配置文件
disable_gpg_check关闭gpg_check
disablerepo不启用某个源
enablerepo启用某个源
list
name要进行操作的软件包的名字也可以传递一个url或者一个本地的rpm包的路径
state状态presentabsentlatest
示例
ansible test -m yum -a 'name=httpd state=latest'
ansible test -m yum -a 'name="@Development tools" state=present'
ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
13.mount
配置挂载点
选项
dump
fstype必选项挂载文件的类型
name必选项挂载点
opts传递给mount命令的参数
passno
src必选项要挂载的文件
state必选项
present只处理fstab中的配置
absent删除挂载点
mounted自动创建挂载点并挂载之
umounted卸载
示例
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'

第三部分建立一个完整的剧本
1、对于ansible来说有点像现实生活中的编剧一样。能够为定义好需要的各种角色每个角色在所需要的环境中所扮演的的角色及其作用范围。先说明下一个ansible剧本所需要的剧本以及需要执行的动作
[iyunv@node1 ~]# tree ansible_playbook/
ansible_playbook/——首先需要给整个剧本一个剧本名称而这个就是剧本的名字
├── pcsd.yml——指定扮演角色的身份及其执行先后顺序
└── roles——创建管理所有角色的目录
    ├── pacemaker——创建角色一的目录其中能够定义相对角色能够执行的命令
    │   ├── files——存放一些可以在所有能够扮演相对角色能复制执行的脚步目录
    │   ├── handlers——存放需要能够重启的文件地
    │   ├── meta
    │   ├── tasks——这个目录是最终要的目录定义角色需要现实的功能如下
    │   │   └── main.yml——
    │   ├── templates——定义模板的目录能够在定义所有的host中实现
    │   └── vars——定义角色锁所能使用的变量
    └── synctime
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        │   └── main.yml
        ├── templates
        └── vars
[iyunv@node1 ~]#
2、对单个角色进行分析说明
对于每个角色都需要上面定义的每个目录fileshandlerstemplatestasksvarsmeta。
Handers此目录中应当包含一个main.yml文件用于定义此角色用到的各handler在handler中使用include包含的其它的handler文件也应该位于此目录中
Tasks此目录至少应该包含一个名为main.yml的文件其定义了此角色的任务列表此文件可以使用include包含其它的位于此目录中的task文件
Files对于此目录来说主要存放能够copy及其script执行的文件
Templates此目录定义template模块能够调用的模板此目录中的文件以jinjia2格式定义
vars目录应当包含一个main.yml文件用于定义此角色用到的变量
meta目录应当包含一个main.yml文件用于定义此角色的特殊设定及其依赖关系ansible 1.3及其以后的版本才支持
3、对于一个角色所能扮演的功能进行说明
对于handers来说需要包含一个main.yml文件主要定义的如下
[iyunv@localhost ansible_playbook]# cat roles/keepalived/handlers/main.yml
- name: restart keepalived相对于来说- name只是书写的方式是固定的格式主要作用在于标明需要执行的程序名称及其所要执行的动作
  service: name=keepalived state=restarted此命令才是真正能够执行的动作
[iyunv@localhost ansible_playbook]#

对于tasks来说主要是用来定义当前角色所能够执行的动作如下
[iyunv@localhost ansible_playbook]# cat roles/keepalived/tasks/main.yml
- name: install keepalived——对于name来说在ansible中是启动一个标识的作用不会被执行。而跟在name下面的命令才会被执行
  yum: name=keepalived state=present——通过yum进行安装程序
- name: template configure file——
  template: src=keepalived.conf.j1 dest=/etc/keepalived/keepalived.conf——定义需要执行的模板及其模板在相对于客户户端能够生成的文件
  when: ansible_nodename ==  'node3.dns.com'——相对于ansible而言还能够在执行剧本的时候进行一定程度上的判断来对管理主机进行分别的管理
  tags: conffile——标明当配置文件如果没有发生改变即跳过执行
  notify: ——通告
  - restart keepalived——能够执行相对管理主机上的对于服务需要重启
- name: template configure file
  template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf
  when: ansible_nodename ==  'node1.dns.com'
  tags: conffile
  notify:
  - restart keepalived
- name: start keepalived service
  service: name=keepalived state=started
4、补充的部分
在tasks中的main.yml中还以使用很多的命令几乎ansible能操作的命令都能在其中定义
当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。
- name: add system users
  user: name={{ item }} state=present groups=test
  with_items:
     - test1
     - test2
5、剧本定义完成之后就可以去执行剧本犹如演绎出话剧一样
[iyunv@wp ansible_playbook]# ansible-palybook  keepalived.yml
PLAY [keepalived] *************************************************************
GATHERING FACTS ***************************************************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
TASK: [synctime | sync time from 172.16.0.1] **********************************
[0;32mok: [172.16.17.1][0m
[0;32mok: [172.16.17.3][0m
TASK: [keepalived | install keepalived] ***************************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
TASK: [keepalived | template configure file] **********************************
[0;36mskipping: [172.16.17.1][0m
[0;36mskipping: [172.16.17.3][0m
TASK: [keepalived | template configure file] **********************************
[0;36mskipping: [172.16.17.1][0m
[0;36mskipping: [172.16.17.3][0m
TASK: [keepalived | start keepalived service] *********************************
[0;32mok: [172.16.17.3][0m
[0;32mok: [172.16.17.1][0m
PLAY RECAP ********************************************************************
  changed=4    unreachable=0    failed=0   
  changed=4    unreachable=0    failed=0   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-148995-1-1.html 上篇帖子: Ansible中文手册 下篇帖子: ansible-playbook 使用mysql_replication抛出的警告信息是? Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表