温柔1饿 发表于 2015-12-10 08:48:10

Linux服务之ansible自动化

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

2.2、对于ANSIBLE来说需要在服务器上进行部署想关进程才能对其划分的服务器进行管理。而安装程序需要的安装有如下几个# rpm -qa ansibleansible-1.9.2-1.el7.noarch如果是手动编译安装需要解决其依赖关系其需要的依赖包如下python-jinja2 PyYAML python-paramiko python-babel python-crypto2.3、ANSIBLE主要的一些配置文件# 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端能基于密钥认证的方式联系各被管理节点。如下的操作# ssh-keygen ——对于弹出来的界面回车到结束即可# ssh-copy-id -i~/.ssh/id_rsaroot@172.16.17.1# ssh-copy-id -i~/.ssh/id_rsaroot@172.16.17.22把所有的需要管理的服务器统一添加都群组中去。2.5、ansible简单的操作如下 ansible <host-pattern> [-f forks] [-m module_name] [-a args]# ansible-doc -sUsage: ansible-doc 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# 3、ansible具体介绍3.1、对其主配置文件进行说明# vim /etc/ansible/ansible.cfg inventory      = /etc/ansible/hosts——默认用户存放文件#library      = /usr/share/my_modules/——ansible默认模块remote_tmp   = $HOME/.ansible/tmppattern      = *——全局匹配forks          = 5——分叉五次poll_interval= 1——投票间隔sudo_user      = root——默认以root用户设置#remote_port    = 22——默认远程端口sudo_exe = sudo——以sudo的方式执行执行权限timeout = 10——ssh连接超时10s
# vim /etc/ansible/hosts 定义ansible组172.16.17.1172.16.17.3172.16.17.4172.16.17.53.2、对于ansible而言除了能够单个命令执行还可以定义剧本一次执行。第二部分、接下说说ansible常用模块1、Setup收集远程主机的服务器的基本信息AnsibleHOSTS-m setup2、File 设置文件的一些常用属性# ansible-doc -sfileforce需要在两种情况下强制创建软链接一种是源文件不存在但之后会建立的情况下另一种是目标软链接已存在,需要先取消之前的软链然后创建新的软链有两个选项yes|nogroup定义文件/目录的属组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    # 移除某个文件但是如果不存在就不执行 例子# ansible nginx -m command -a 'date'172.16.17.1 | success | rc=0 >>Thu Oct 22 00:51:39 CST 2015172.16.17.22 | success | rc=0 >>Thu Oct 22 00:51:39 CST 20154、user   添加用户# 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 )例子# ansible all -m cron -a 'name="sync time from ntpserver"state=present minute=*/3 job="/bin/cat /etc/issue &> /dev/null"'# ansible all -m cron -a 'name="sync time from ntpserver"state=absent '7、copy 复制文件   复制文件到远程主机copy模块包含如下选项backup在覆盖之前将原文件备份备份文件包含时间信息。有两个选项yes|nocontent用于替代"src",可以直接设定指定文件的值dest必选项。要将源文件复制到的远程主机的绝对路径如果源文件是一个目录那么该路径也必须是个目录directory_mode递归的设定目录的权限默认为系统默认权限force如果目标主机包含该文件但内容不同如果设置为yes则强制覆盖如果为no则只有当目标主机的目标位置不存在该文件时才复制。默认为yesothers所有的file模块里的选项都可以在这里使用src要复制到远程主机的文件在本地的地址可以是绝对路径也可以是相对路径。如果路径是一个目录它将递归复制。在这种情况下如果路径使用"/"来结尾则只复制目录里的内容如果没有使用"/"来结尾则包含目录在内的整个内容全部复制类似于rsync。示例ansible test -m copy -a "src=/etc/issuedest=/tmp/issueowner=root group=root mode=0644"ansible nginx -m copy -a 'src=/etc/issue dest=/tmp/issue backup=yes'8、ping 测试网络使用的# 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|noname必选项服务名称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_checkdisablerepo不启用某个源enablerepo启用某个源listname要进行操作的软件包的名字也可以传递一个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配置挂载点选项dumpfstype必选项挂载文件的类型name必选项挂载点opts传递给mount命令的参数passnosrc必选项要挂载的文件state必选项present只处理fstab中的配置absent删除挂载点mounted自动创建挂载点并挂载之umounted卸载示例name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=presentname=/srv/disk src='LABEL=SOME_LABEL' state=presentname=/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剧本所需要的剧本以及需要执行的动作# 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# 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文件主要定义的如下# cat roles/keepalived/handlers/main.yml - name: restart keepalived相对于来说- name只是书写的方式是固定的格式主要作用在于标明需要执行的程序名称及其所要执行的动作service: name=keepalived state=restarted此命令才是真正能够执行的动作#
对于tasks来说主要是用来定义当前角色所能够执行的动作如下# 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 filetemplate: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.confwhen: ansible_nodename =='node1.dns.com'tags: conffilenotify: - restart keepalived- name: start keepalived serviceservice: name=keepalived state=started4、补充的部分在tasks中的main.yml中还以使用很多的命令几乎ansible能操作的命令都能在其中定义当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。- name: add system usersuser: name={{ item }} state=present groups=testwith_items:   - test1   - test25、剧本定义完成之后就可以去执行剧本犹如演绎出话剧一样# ansible-palybookkeepalived.yml PLAY ************************************************************* GATHERING FACTS *************************************************************** TASK: ********************************** TASK: *************************************** TASK: ********************************** TASK: ********************************** TASK: ********************************* PLAY RECAP ******************************************************************** changed=4    unreachable=0    failed=0   changed=4    unreachable=0    failed=0   

页: [1]
查看完整版本: Linux服务之ansible自动化