wordpress企业网站源码,石家庄专业商城网站制作,成都最好的设计院,网站被黑 原因文章目录 1、when语句1、判断表达式1、比较运算符2、逻辑运算符3、根据rc的返回值判断task任务是否执行成功5、通过条件判断路径是否存在6、in 2、when和其他关键字1、block关键字2、rescue关键字3、always关键字 3、ansible循环语句1、基于列表循环(whith_items)2、基于字典循… 文章目录 1、when语句1、判断表达式1、比较运算符2、逻辑运算符3、根据rc的返回值判断task任务是否执行成功5、通过条件判断路径是否存在6、in 2、when和其他关键字1、block关键字2、rescue关键字3、always关键字 3、ansible循环语句1、基于列表循环(whith_items)2、基于字典循环(with_dict)3、loop循环 4、jinja2模块管理1、为什么需要这个2、jinjia条件语句3、jinjiafor语句4、jinjia2过滤器1、default过滤器2、password_hash 5、角色1、为什么需要角色2、创建角色 1、when语句 判断的结果一致的话就执行任务否则跳过任务 ansible中判断语句是when判断默认when判断就识别变量所以的话不需要使用{{}}来引用变量when inventory_hostname node1 还有一个点就是如果不使用变量的话就只使用这个值的话那么的话就要带上这个双引号并且里面还要有单引号即可 层级和模块的层级一样
1、判断表达式
1、比较运算符
符号作用比较2边是否相等!比较2边左边大于右边
2、逻辑运算符
符号作用and逻辑与2边都为真则返回or逻辑或有一个为真则返回真not逻辑否对表达式进行取反真为假假为真
3、根据rc的返回值判断task任务是否执行成功
[rootcontroller mnt]# cat f8.yml
- hosts: node1tasks:- shell: ls /etc/passsssssregister: get_statusignore_errors: yes- debug:msg: rc is 0when: get_status.rc 0- debug:msg: rc is errorwhen: get_status.rc ! 05、通过条件判断路径是否存在
名称作用file判断指定路径是否为一个文件directory判断指定路径是否是一个目录link判断指定路径是否为一个软链接mount判断路径是否为挂载点exists判断指定路径是否存在
# /etc/passwd存在的话就执行任务
# when直接使用值的话需要使用双引号里面的值在加上单引号即可
[rootcontroller mnt]# cat f9.yaml
- hosts: alltasks:- debug:msg: existwhen: /etc/passwd is exists6、in
判断值是不是在列表中
[rootcontroller mnt]# cat f3.yml
- hosts: node1tasks:- debug:msg: ens160 existswhen: ens160 in ansible_interfaces2、when和其他关键字
1、block关键字
判断一个部分的任务是否成功执行
[devopscontroller ansible]$ cat when/2.yaml
- hosts: alltasks:- block:- file:path: /mnt/111.txtstate: touch- file:path: /mnt/1.dirstate: directorywhen: inventory_hostname node1
2、rescue关键字
block中任务失败的话就会执行rescue下的任务否则不执行
- name: rescuehosts: alltasks:- block:- shell: ls /etc/p11111- file:path: /etc/passwdstate: filerescue:- debug:msg: rescuewhen: inventory_hostname node13、always关键字
无论block任务执行成功还是失败都会执行的
- name: rescuehosts: alltasks:- block:- shell: ls /etc/p11111- file:path: /etc/passwdstate: filerescue:- debug:msg: rescuealways:- debug:msg: alwayswhen: inventory_hostname node1
3、ansible循环语句
1、基于列表循环(whith_items)
- hosts: allvars:users:- zhangsan- lisi- wangwutasks:- debug:msg: {{ item }}with_items: {{users}}
2、基于字典循环(with_dict)
[devopscontroller ansible]$ cat dict.yaml
- hosts: allvars:users:q1:uid: 2022name: zhangsanq2:uid: 2023name: lisitasks:- debug:msg: {{ item.value.name }}with_dict: {{ users }}# vaule就是uid和name
3、loop循环
天生用来便利列表也可以过滤字典
[devopscontroller ansible]$ cat loop.yml
- hosts: allvars:users:- zhangsan- lisi- wangwutasks:- debug:msg: {{ item }}loop: {{ users }} # 循环里面
4、jinja2模块管理
1、为什么需要这个 很多个主机都要搭建httpd服务将一个httpd的配置文件拷贝到其余的主机上面上面的ip地址都是一样的所以的话这个jinjia2模版文件会根据不同主机更改需要的内容 将带有变量的模版拷贝到其他节点上面变量会自动的识别出来的值
[devopscontroller ansible]$ cat j1.yml
- hosts: alltasks:- template:src: /mnt/http.conf.j2dest: /mnt/httpd.conf
[devopscontroller ansible]$ cat /mnt/http.conf.j2
Listen {{ ansible_ens160.ipv4.address }}:80# 会根据不同的主机来获取到不同的信息
2、jinjia条件语句 跟when语句是一样的 主要就是利用了setup收集事实变量从而实现内容的更替
# 格式
{% if 表达式 %}
执行语句
{% elif 表达式 %}
执行语句{% else %}
执行语句{% endif %}# 需求如果是node1主机就显示node1 is ok node2主机就显示node2 is ok
[devopscontroller ansible]$ cat /mnt/1.j2
{% if ansible_hostname node1 %}
node1 is ok
{% elif ansible_hostname node2 %}
node2 is ok
{% else %}
error
{% endif %}[devopscontroller ansible]$ cat j2.yml
- hosts: alltasks:- template:src: /mnt/1.j2dest: /mnt/1
3、jinjiafor语句
{% for 变量 in 循环体 %}
执行语句
{% endof %}groups.all 获取所有主机 hostvars 获取指定主机的信息比如获取node1的fqdn hostvars[node1].ansible_fqdn
[devopscontroller ansible]$ cat j3.yml
- hosts: alltasks:- template:src: /mnt/3.j2dest: /etc/hosts[devopscontroller ansible]$ cat /mnt/3.j2
{% for i in groups.all %}
{{ hostvars[i].ansible_ens160.ipv4.address }} {{ hostvars[i].ansible_fqdn}} {{ hostvars[i].ansible_hostname}}
{% endfor %}
4、jinjia2过滤器
1、default过滤器
default 就是没有值的就使用定义的默认值
[devopscontroller ansible]$ cat p1.yml
- hosts: nodevars:users:- name: qquid: 3333- name: ww- name: rrtasks:- debug:msg: {{ item.uid|default(9999) }}loop: {{ users }}
2、password_hash
[devopscontroller ansible]$ cat p2.yml
- hosts: nodetasks:- user:name: j11password: {{123|password_hash(sha512)}}5、角色
1、为什么需要角色 解决了这个剧本之间的移植的关系使用了角色的话就可以直接移植到其他主机上面也能进行运行就变得非常的高效了 角色的组成部分 files用于存放一些非模版文件的文件就是一些普通的文件会被复制到被控节点上面的 templates用于存放角色相关的jinja2模版文件当使用角色相关的模版时如果没有明确指定模版的路径则默认使用此目录中的模版 tasks角色所需要执行的所有任务文件都存放于此包含一个主文件main.yml可以通过include的方式引入其他任务文件就是可以创建多个tasks任务然后在main,yml里面进行引用 handlers用于定义角色中需要调用的handlers包含一个主配置文件main.yml也可以通过include引入其他的handlers文件 vars定义此角色要用到的变量包含一个主文件main.yml meta用于存储角色的元数据信息这个写元数据用于描述角色的相关属性作者等 defaults除了vars目录也可以定义角色用到的变量定义的变量的优先级是最低的
2、创建角色
[devopscontroller ansible]$ ansible-galaxy init apache
- Role apache was created successfully[devopscontroller apache]$ ls
defaults files handlers meta README.md tasks templates tests vars# 编写一个httpd
[devopscontroller tasks]$ cat main.yml
---
# tasks file for apache- name: mountmount:src: /dev/sr0path: /mediafstype: iso9660state: mounted
- name: use yumyum:name: httpdstate: present
- name: use templatetemplate:src: httpd.conf.j2dest: /etc/httpd/conf/httpd.conf
- name: index.htmlcopy:src: index.htmldest: /var/www/html/
- name: serviceservice:name: {{item}}state: startedenabled: yesloop:- firewalld- httpd
- name: firewalldfirewalld:service: httppermanent: yesstate: enabledimmediate: yes# {{}} 输出变量for和if可以一起使用
{% if inventory_hostname node1 %}
Listen {{hostvars[node1].ansible_ens160.ipv4.address}}:80
{% elif inventory_hostname node2 %}
Listen {{hostvars[node2].ansible_ens160.ipv4.address}}:80
{% endif %}