ansible技术学习总结
2017-06-11 11:47
357 查看
最近因项目需要使用ansible编写自动化部署的脚本,下面做一些小结,目前知涉及到项目中用到的一些东西
环境:redhat7.2
执行命令
ansible的hosts文件
脚本目录
xxx_init.yml脚本介绍
ansible脚本使用yml语法格式,内容看起来清晰明了,同时格式有一定的要求,比如空格,初期会因为格式不正确,多出或者少了空格而报错,也是很莫名奇妙的。
common/main.yml脚本脚本内容
在云化环境下,根据自己的产品创建对应的镜像,如果使用官方镜像,会比较大,上传镜像文件或者创建虚拟机相对来讲比较耗时,这里可以使用官方最小镜像进行安装,但一些自定义的rpm如何创建yum源呢?
如何使用ansible创建自定义yum源呢?可以参考下面的内容(create_yum_source.yml)
template模块中,如何获取hosts中其他组信息,如其他group组的setup模块信息,参考下面的代码
ansible脚本如何像java一样使用 try catch finally?
ansible安装jdk,配置环境变量(ansible安装远程机器,配置环境变量,使用source /etc/profile 不生效?,参考下面的代码)
除了在/etc/profile文件添加环境变量,并source;还要在/root/.bashrc 文件中添加环境变量,并source
如果修改了上面2个文件后,执行source指令还没有生效?
原因:请把被控制机的远程登录界面关掉的情况下执行ansible脚本即可生效
ansible如何判定hosts文件中某个组下面机器的个数?
场景:当hosts文件中某个组下面没有机器时,执行缩容操作,如果有机器,执行扩容操作
ansible 如何判定一个文件夹是否存在,如果存在则执行相应的操作?
ansible如何将多个文件传到被控制上?(仅跟上一步)
先进行压缩,然后使用unarchive模块传到被控制机上,多个文件速度比copy要快
环境:redhat7.2
执行命令
ansible-playbook -i host xxx_init.yml
ansible的hosts文件
[MANAGE:children]#管理节点,分主备 MANAGE_PRIMARY MANAGE_BACKUP [MANAGE_PRIMARY] 10.100.100.100 [MANAGE_BACKUP] 10.100.100.101 [FRONT:children]#前台节点,分主备,主要负责一些负载均衡,消息转发 FRONT_PRIMARY FRONT_BACKUP [FRONT_PRIMARY] 10.100.100.102 [FRONT_BACKUP] 10.100.100.103 [BACK]#后台节点,处理北向请求 10.100.100.104 10.100.100.105
脚本目录
callback_plugins目录存放的是ansible插件内容 group_vars目录存放变量文件 roles存放脚本 xxxx_init.yml脚本入口文件
xxx_init.yml脚本介绍
--- - hosts: all#all表示上面hosts文件中所有的节点都会执行 serial: 10#ansible默认是连接5台服务器,为从优化性能考虑,这里设置为10(同时也可以修改ansible的配置文件进行设置) roles: - role: common#指定需要执行的role vars_files: - group_vars/main_vars.yml#指定变量文件 - hosts: MANAGE gather_facts: no# roles: - role: manage vars_files: - group_vars/main_vars.yml - hosts: FRONT gather_facts: no#为从优化性能考虑,关闭gather_facts(因为在执行脚本时,发现在切换脚本执行时,会执行setup模块,浪费时间,当上面的all尽量不要关闭gather_facts,因为脚本中会有获取相关信息的操作) roles: - role: front vars_files: - group_vars/main_vars.yml - hosts: BACK gather_facts: no roles: - role: back vars_files: - group_vars/main_vars.yml #注意事项:在hosts: all中,如果没有需要所有机器都要执行的这部操作的话,可以省略,但如果需要在hosts文件中的一个group组中想去获取其他group组的setup模块中的信息,可以只写下面的内容 - hosts: all
ansible脚本使用yml语法格式,内容看起来清晰明了,同时格式有一定的要求,比如空格,初期会因为格式不正确,多出或者少了空格而报错,也是很莫名奇妙的。
common/main.yml脚本脚本内容
--- - name: mode /root/.ssh/id_rsa permission to 600#这里相当于一个log command: chmod 600 /root/.ssh/id_rsa removes=/root/.ssh/id_rsa#执行command模块,直接执行命令,removes的意思是当该文件存在时才会执行这个赋予权限的操作,如果知道该文件是存在的话,执行文件付权限操作可以使用file模块 - include: create_yum_source.yml#执行create_yum_source.yml脚本 - include: jdk/install_jdk.yml
在云化环境下,根据自己的产品创建对应的镜像,如果使用官方镜像,会比较大,上传镜像文件或者创建虚拟机相对来讲比较耗时,这里可以使用官方最小镜像进行安装,但一些自定义的rpm如何创建yum源呢?
如何使用ansible创建自定义yum源呢?可以参考下面的内容(create_yum_source.yml)
#安装createrepo,这里是将createrepo及相关的依赖包找出来,然后使使用rpm方式进行安装 --- - name: install createrepo #安装createrepo shell: rpm -ivh {{ rpm_packages_path }}{{ item }} #rpm_packages_path变量为rpm包的路径 ignore_errors: True with_items: - deltarpm-3.6-3.el7.x86_64.rpm - python-deltarpm-3.6-3.el7.x86_64.rpm - createrepo-0.9.9-23.el7.noarch.rpm #创建yum源 - name: createrepo create packages link command: createrepo {{ rpm_packages_path }} #复制repo文件 - name: copy packages.repo files template: src={{ item }} dest=/etc/yum.repos.d/ with_items: - packages.repo ############################################## packages.repo文件内容: [packages] name=packages baseurl=file://{{ rpm_packages_path }} enabled=1 gpgcheck=0 #{{ rpm_packages_path }}是ansible引用变量的方式,该变量定义在group_vars/main_vars.yml文件中 ############################################## 这里涉及到template模块,说一下temolate模块作用和用法 template模块主要是复制文件作用,同时file,copy,fatch模块也有复制文件作用 template模块中可以引用变量,写if判断,for循环等 参考下面template文件可以定义的小案例,案例为将keepalived的配置文件keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface {{ front_vrrp_instance_interface }}#前面定义的变量 virtual_router_id 40 priority 101 advert_int 2 garp_master_delay 1 authentication { auth_type PASS auth_pass 1111 } track_interface { {# 这里是想将该FRONT组中所有的网卡写入这里,除了lo网口,front_master_name为前面定义好的变量 #} {% for host in groups['FRONT'] %} {% if hostvars[host]['ansible_nodename'] == front_master_name %} {% for interface in hostvars[host]['ansible_interfaces'] %} {% if interface != 'lo' %} {{ interface }} {% endif %} {% endfor %} {% endif %} {% endfor %} } virtual_ipaddress { {{ vnf_context_data.vnf_attributes.extensions.front_vip }}/32 } track_script { chk_haproxy } }
template模块中,如何获取hosts中其他组信息,如其他group组的setup模块信息,参考下面的代码
{% for host in groups['FRONT'] %} {% if hostvars[host]['ansible_nodename'] == front_master_name %} {% for interface in hostvars[host]['ansible_interfaces'] %} {% if interface != 'lo' %} {{ interface }} {% endif %} {% endfor %} {% endif %} {% endfor %} ######################### 说明: groups['FRONT']为hosts文件中[FRONT]组下面的机器(注意格式) 上面代码表示为遍历hosts文件中[FRONT]组中所有机器,当机器的hostname为front_master_name(定义的变量)时,则将该机器所有的网卡获取出来,除了lo网口 注意:在xxx_init.yml入口文件中要有 - hosts: all 类似一个全局变量
ansible脚本如何像java一样使用 try catch finally?
tasks: - name: Attempt and gracefull roll back demo block: #like java try - debug: msg='I execute normally' - command: /bin/false - debug: msg='I never execute, due to the above task failing' rescue: #like java catch - debug: msg='I caught an error' - command: /bin/false - debug: msg='I also never execute :-(' always: #like java finally - debug: msg="this always executes"
ansible安装jdk,配置环境变量(ansible安装远程机器,配置环境变量,使用source /etc/profile 不生效?,参考下面的代码)
除了在/etc/profile文件添加环境变量,并source;还要在/root/.bashrc 文件中添加环境变量,并source
- name: check jdk variable shell: cat /etc/profile register: result - name: jdk variable configuration /etc/profile file shell: /bin/echo {{ item }} >> /etc/profile; source /etc/profile when: result.stdout.find('JAVA_HOME') == -1 with_items: - export JAVA_HOME=/usr/java/jdk{{ jdk_version }} - export JAVA_BIN=/usr/java/jdk{{ jdk_version }}/bin - export PATH=$PATH:/usr/java/jdk{{ jdk_version }}/bin - export JRE_HOME=/usr/java/jdk{{ jdk_version }}/jre - export CLASSPATH=.:/usr/java/jdk{{ jdk_version }}/lib:/usr/java/jdk{{ jdk_version }}/jre/lib - export JAVA_HOME JAVA_BIN PATH JRE_HOME CLASSPATH - name: check jdk variable shell: cat /root/.bashrc register: bashrc_result - name: jdk variable configuration /root/.bashrc file shell: /bin/echo {{ item }} >> /root/.bashrc; source /root/.bashrc when: bashrc_result.stdout.find('JAVA_HOME') == -1 with_items: - export JAVA_HOME=/usr/java/jdk{{ jdk_version }}
如果修改了上面2个文件后,执行source指令还没有生效?
原因:请把被控制机的远程登录界面关掉的情况下执行ansible脚本即可生效
ansible如何判定hosts文件中某个组下面机器的个数?
场景:当hosts文件中某个组下面没有机器时,执行缩容操作,如果有机器,执行扩容操作
如 hosts,文件中new组下面的机器个数为0个,执行缩容 [new] 如果new组下面机器多个,执行扩容操作 [new] 172.10.10.1 ########################### 判定语句: when: (groups['new']|length > 0)
ansible 如何判定一个文件夹是否存在,如果存在则执行相应的操作?
- name: judge templates directory if exit shell: ls /home/templates/ connection: local register: result ignore_errors: True #- debug: var=result verbosity=0 - include: syn_templates.yml when: result.rc == 0
ansible如何将多个文件传到被控制上?(仅跟上一步)
先进行压缩,然后使用unarchive模块传到被控制机上,多个文件速度比copy要快
syn_templates.yml 如下: --- - name: gzip templates command: tar -zcvf /tmp/templates.tar.gz /home/templates connection: local - name: syn templates to dest server unarchive: src=/tmp/templates.tar.gz dest=/ group=sfy owner=sfy-adm
相关文章推荐
- 几点有关Web Services的技术学习总结
- 技术的学习与总结的起点
- 总结必须学习的10项.NET技术
- 总结必须学习的10项.NET技术
- 总结必须学习的10项.NET技术
- 几点有关Web Services的技术学习总结
- Spring核心技术学习总结
- 总结必须学习的10项.NET技术
- 总结必须学习的10项.NET技术
- 总结必须学习的10项.NET技术
- .NET Romoting 学习总结(一)——Remoting技术之激活模式全接触
- 总结一天来学习无闪烁刷新技术
- 几点有关Web Services的技术学习总结
- 总结必须学习的10项.NET技术
- java学习基础篇之WEB开发中常用Jsp/Bean相关技术总结(转)
- 对缓冲(caching)技术的一些学习总结
- .NET Romoting 学习总结(四)—— Remoting技术细节之多通道注册
- 7年软件开发技术学习的经验与模式总结Part1
- 总结必须学习的10项.NET技术
- 总结必须学习的10项.NET技术