Ansible 流程控制
一、playbook条件语句
不管是shell还是各大变成语言中,流程控制,条件判断这些都是必不可少的,在我们使用Ansible的过程中,条件判断的使用频率极其高。 例如: 1.我们使用不同的系统的时候,可以通过判断系统来对软件包进行安装。 2.在nfs和rsync安装过程中,客户端服务器不需要推送配置文件,之前我们都是写多个play,会影响效率。 3.我们在源码安装nginx的时候,执行第二遍就无法执行了,此时我们就可以进行判断是否安装过。
1.稍微修改lnmp.yml
#修改部分,使用自己配置好的博客站点目录 - name: Install Wordpress Code unarchive: src: /root/blog.tar.gz dest: / #添加数据库导入部分 - name: Post wordpress.sql copy: src: /root/db01/root/wordpress.sql dest: /tmp/ - name: Import wordpress.sql mysql_db: state: import name: wordpress target: /tmp/wordpress.sql
2.判断主机
- name: Create www Group #如果主机名等于web01,执行下方命令 group: name: www gid: 666 state: present when: ansible_fqdn == "web01" #判断语句中变量不需要加大括号和引号,因为不需要打印 #when: ansible_fqdn is match "web*" #当主机名匹配web*,用于多台web #when: ansible_fqdn != "db01" #当主机名不等于db01 - name: Create www User #如果主机名等于web01或web02执行下方命令 user: name: www gid: 666 group: www create_home: false shell: /sbin/nologin state: present when: (ansible_fqdn == "web01") or (ansible_fqdn == "web02") # ()加or表示多个
3.如何判断服务是否安装
通过rpm -qa|grep php 命令返回的$?来判断是否已经安装,0表示安装,1表示未安装 - hosts: web01 tasks: #执行shell,判断服务是否安装,并把结果注册一个变量 - name: Get PHP Install Status shell: "rpm -qa | grep php" ignore_errors: yes #获取状态,加上忽略错误(否则非0报错,不往下执行) register: get_php_install_status #调用变量,查看内容,如果知道使用什么值判断可以不写 - name: Get get_php_install_status debug: #输出 msg: "{{ get_php_install_status }}" #调用变量结果,rc值不等于0时执行安装命令 - name: Install PHP Server shell: "yum localinstall -y /tmp/*.rpm" when: get_php_install_status.rc != 0 #rc就是$?返回
4.判断系统
[root@m01 base]# vim xitong.yml - hosts: web01 tasks: - name: Install CentOS apache shell: "yum install -y httpd" when: ansible_distribution == "CentOS" - name: Install Ubuntu apache shell: "apt-get apache" when: ansible_distribution == "Ubuntu"
5.判断系统版本
[root@m01 base]# vim start.yml - hosts: web01 tasks: - name: Start CentOS6 apache shell: "/etc/init.d/httpd start" when: (ansible_distribution == "CentOS") and (ansible_distribution_major_version == "6") - name: Install Ubuntu apache shell: "apt-get apache" when: (ansible_distribution == "CentOS") and (ansible_distribution_major_version == "7") #指定多个条件,除了用and,还可以使用列表形式 - hosts: web01 tasks: - name: Start CentOS6 apache shell: "/etc/init.d/httpd start" when: - ansible_distribution == "CentOS" - ansible_distribution_major_version == "6" - name: Install Ubuntu apache shell: "apt-get apache" when: - ansible_distribution == "CentOS" - ansible_distribution_major_version == "7"
6.可以通过提示决定是否执行
#当企业里有很多版本的系统时,先判断版本是否支持服务再进行操作 tasks: - shell: echo "only on Red Hat 6, derivatives, and later" when: ansible_facts['os_family'] == "RedHat" and ansible_facts['lsb']['major_release']|int >= 7
二、playbook循环语句
1.定义变量循环安装
- hosts: db01 tasks: - name: Install Mariadb Server yum: name: "{{ package }}" state: present vars: package: - mariadb-server - MySQL-python
2.定义变量启动服务
#错误配置方法 - name: Start PHP and Nginx Server systemd: name: "{{ server }}" state: started enabled: yes vars: #同时执行,当成一个字符串 server: - php-fpm - nginx #正确做法 - name: Start PHP and Nginx Server systemd: name: "{{ item }}" #固定写法 state: started enabled: yes with_items: #固定写法,设置变量,一个一个执行 - php-fpm - nginx
3.字典定义变量
#创建用户组 - name: Create www lhd test Group group: name: "{{ item.name }}" gid: "{{ item.gid }}" state: present with_items: - { name: "www", gid: "666"} - { name: "lhd", gid: "777"} - { name: "test", gid: "888"} #创建多个用户 - name: Create www lhd test User user: name: "{{ item.name }}" uid: "{{ item.uid }}" group: "{{ item.group }}" create_home: "{{ item.create_home }}" shell: "{{ item.shell }}" state: present with_items: - { name: "www", uid: "666", group: "www", create_home: "false", shell: "/sbin/nologin"} - { name: "lhd", uid: "777", group: "lhd", create_home: "true", shell: "/sbin/nologin"} - { name: "test", uid: "888", group: "test", create_home: "false", shell: "/bin/bash"} #创建多个目录(赋权,没有目录就会创建) - name: Chown Code Dir file: path: "{{ item.path }}" state: directory owner: "{{ item.user }}" group: "{{ item.user }}" recurse: yes with_items: - { path: "/code", user: "www" } - { path: "/data", user: "lhd" }
4.利用字典定义方式优化lnmp.yml
- name: Config Nginx Server copy: src: "{{ item.src }}" dest: "{{ item.dest }}" with_items: - { src: "/root/nginx.conf", dest: "/etc/nginx/" } - { src: "/root/wordpress.conf", dest: "/etc/nginx/conf.d/" } - name: Tar PHP and Wordpress Package unarchive: src: "{{ item.src }}" dest: "{{ item.dest }}" with_items: - { src: "/root/php.tar.gz", dest: "/tmp/" } - { src: "/root/blog.tar.gz", dest: "/" }
标签:www,shell,name,when,28,item,ansible,安装 From: https://www.cnblogs.com/ludingchao/p/18123946