希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 ansible-语法 丁D 学无止境 2019-04-04 15:18 2434已阅读 ansible 语法 摘要变量,循环,逻辑判断 # 定义变量 使用**vars**关键字 ```js --- - hosts: test70 vars: testvar1: testfile remote_user: root tasks: - name: task1 file: path: /testdir/{{ testvar1 }} state: touch ``` 上述使用vars定义一个变量testvar1 并使用{{ testvar1 }}来引用 ```js vars: testvar1: testfile testvar2: testfile2 ``` 上述定义多个变量 ```js --- - hosts: test70 remote_user: root vars: nginx: conf80: /etc/nginx/conf.d/80.conf conf8080: /etc/nginx/conf.d/8080.conf tasks: - name: task1 file: path: "{{nginx.conf80}}" state: touch - name: task2 file: path: "{{nginx.conf8080}}" state: touch ``` 上述playbook 引用变量 "{{nginx.conf8080}}" 如果让在**开头要用引号** ### 变量文件分离 可以在某个文件定义变量,,然后playbook引用该文件,关键字 **vars_files** **必须用-开头** ```js # cat nginx_vars.yml nginx: conf80: /etc/nginx/conf.d/80.conf conf8080: /etc/nginx/conf.d/8080.conf --- - hosts: test70 remote_user: root vars_files: - /testdir/ansible/nginx_vars.yml tasks: - name: task1 file: path={{nginx.conf80}} state=touch - name: task2 file: path={{nginx['conf8080']}} state=touch ``` ### 收集远程节点的信息 ansible每运行一个playbook默认会运行一个【Gathering Facts】任务,通过这个任务可以收集远程主机的信息(如ip地址,主机名,系统版本,硬件配置等) 当我们想要查看【Gathering Facts】任务收集的信息需要使用**setup模块** ```js ansible test70 -m setup ``` ![alt](/upload/20190408103727.png ) 上面 返回的 内容很多不好查看,可以使用下面的filter进行过滤, 也可以使用通配符 ```js ansible test70 -m setup -a 'filter=ansible_memory_mb' ansible test70 -m setup -a "filter=*mb*" ``` # 循环 使用with_items来处理循环,使用item来获取每一个循环。 ```js //例子1: 通过循环输出为分组的信息 --- - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{item}}" with_items: "{{groups.ungrouped}}" //例子2: 通过debugger输出循环 1 2 3 --- - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{item}}" with_items: - 1 - 2 - 3 //例子3 通过循环创建4个file --- - hosts: test70 remote_user: root gather_facts: no vars: dirs: - "/opt/a" - "/opt/b" - "/opt/c" - "/opt/d" tasks: - file: path: "{{item}}" state: touch with_items: "{{dirs}}" //例子4 循环体是对象信息 --- - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{item.test1}}" with_items: - { test1: a, test2: b } - { test1: c, test2: d } ``` #逻辑判断 使用**when**来处理逻辑判断 不是if ```js //ansible_distribution 是一个变量正常来说是要{{ansible_distribution }}来引用但是在when中不用 //例子2 只有ansible_distribution 等于 "CentOS"才输出 "System release is centos" --- - hosts: test70 remote_user: root tasks: - debug: msg: "System release is centos" when: ansible_distribution == "CentOS" //例子2 当item 的值大于1才输出 --- - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{ item }}" with_items: - 1 - 2 - 3 when: item > 1 //例子3 多个条件 --- - hosts: test70 remote_user: root tasks: - debug: msg: "System release is centos7" when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" ``` “==“ :比较两个对象是否相等,相等为真 “!=“ :比较两个对象是否不等,不等为真 “>” :比较两个值的大小,如果左边的值大于右边的值,则为真 “<“ :比较两个值的大小,如果左边的值小于右边的值,则为真 “>=“ :比较两个值的大小,如果左边的值大于右边的值或左右相等,则为真 “<=“ :比较两个值的大小,如果左边的值小于右边的值或左右相等,则为真 and :逻辑与,当左边与右边同时为真,则返回真 or :逻辑或,当左边与右边有任意一个为真,则返回真 not :取反,对一个操作体取反 ( ) :组合,将一组操作体包装在一起,形成一个较大的操作体 in/not in可以判断字符串是否是子字符串(注意整个判断必须引号起来,,关键字也要引号) ```js when: '"no such file" in super_status.stdout' ``` ```js //判断是否含有字符串(从而判断supervisor是否启动supervisor 这个是弱智方法) - name: juge supervisor status shell: supervisorctl status register: super_status ignore_errors: yes - name: print info debug: var=super_status - name: start supervisor shell: /usr/bin/supervisord -c /etc/supervisor/supervisord.conf when: '"no such file" in super_status.stdout' ``` ``` 改造后的2020.06.09 - name: juge supervisor status shell: ps -ef | grep '/usr/bin/supervisord -c /etc/supervisor/supervisord.conf' | grep -v grep | wc -l register: super_status - name: 'print info super_status' debug: msg: var=super_status - name: start supervisor shell: /usr/bin/supervisord -c /etc/supervisor/supervisord.conf when: super_status.stdout|int < 1 ``` ```js //debug引用register变量使用var关键字 并且不能跟msg同时使用 --- - name: chek supervisor is exists stat: path=/usr/bin/supervisord register: supervisor_bin - name: install pip easy_install: name=supervisor when: not supervisor_bin.stat.exists tags: install_pip - name: print info debug: var=supervisor_bin ``` liunx vim编辑时查找关键字 ```js 在命令模式下敲斜杆( / )这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然后输入你要查找的关键字敲回车就可以了。 如果你要继续查找此关键字,敲字符 n 就可以继续查找了。 ``` ###ansible环境变量问题 ```js ansible这类远程执行的non-login shell 并不会加载/etc/profile和~/.bash_profile下的环境变量 只是加载“~/.bashrc”和/etc/bashrc 如果需要在ansible中执行需要特定环境变量的命令,可以将环境变量写在~/.bashrc 并 source一下~/.bash_profile 。 ``` 很赞哦! (0) 上一篇:playbook handle roles tags 下一篇:Jenkins+GitLab+Ansible 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡