如果pyenv、ansible-lint和file中不包含任何字符串,那么任务将不会执行
有人提出了关于不使用Ansible2.7中不推荐的写法的要求,所以这是备忘录。
https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.7.html#deprecated
我在CentOS7上进行了测试。
pyenv是一种在开发环境中管理多个Python版本的工具。
为了让多个Python版本共存并切换使用的工具(类似于Ruby的rbenv)。
(如果只涉及多个Ansible,还可以使用virtualenv之类的工具)
由于在python3.6下使用ansible2.7为了消除Depulicate消息并遵循最佳实践,我安装了ansible-lint并添加了判断Depulicate模块的规则,但是在python2.7下无法安装ansible-lint的4支持规则,所以我用pyenv准备了python3.6。
$ sudo vi /etc/yum.conf ####exclude=kernel*をコメントにする
$ sudo yum -y install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel glibc-headers
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
$ vi ~/.bashrc
export PATH="/home/myuser1/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
$ source ~/.bashrc
$ pyenv
pyenv 1.2.9
Usage: pyenv <command> [<args>]
Some useful pyenv commands are:
commands List all available pyenv commands
local Set or show the local application-specific Python version
$ pyenv install 3.6.8
Downloading Python-3.6.8.tar.xz...
-> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
Installing Python-3.6.8...
Installed Python-3.6.8 to /home/myuser1/.pyenv/versions/3.6.8
$ python --version
Python 2.7.5
$ pyenv global 3.6.8
$ python --version
Python 3.6.8
$ pip install ansible==2.7
$ ansible --version
ansible 2.7.0
config file = /home/myuser1/infra-setup-plugins/ansible.cfg
configured module search path = ['/home/myuser1/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/myuser1/.pyenv/versions/3.6.8/lib/python3.6/site-packages/ansible
executable location = /home/myuser1/.pyenv/versions/3.6.8/bin/ansible
python version = 3.6.8 (default, Feb 4 2019, 14:18:59) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
$ pip install ansible-lint
Successfully installed ansible-lint-4.0.1
$ ansible-lint --version
ansible-lint 4.0.1
请参考以下网址:
https://qiita.com/Kodaira_/items/feadfef9add468e3a85b
https://qiita.com/silverskyvicto/items/424a002065d7b0090802
亚马逊Linux2参考资料
https://qiita.com/tisk_jdb/items/01bd6ef9209acc3a275f
ansible-lint 检查工具
只要确认按照最佳实践进行编写,就会发送出关于消息的工具。
当指定一个列举了角色的playbook时,会出现各种不同的情况。
$ ansible-lint playbook.yml
默认规则在此处
https://docs.ansible.com/ansible-lint/rules/default_rules.html
跳过要跳过的那些项目似乎可以通过使用-x选项或在设置文件中进行指定。
$ ansible-lint -x 405,403 playbook.yml
以下是中国的原生方式的改述,只需要一种选项:
您可以在 ansible-lint 的配置文件文档中找到有关配置文件的信息:https://docs.ansible.com/ansible-lint/configuring/configuring.html#configuration-file
有人注意到从 ansible-lint 4.1 起将删除规则 405 的问题,完整的讨论可以在以下链接中找到:https://github.com/ansible/ansible-lint/issues/456
如果文件中不包含字符串,则任务开始。
如果使用lint时遇到类似“在使用command或shell时,请定义条件”的警告,这是因为在添加“when”之后,从2.9版本开始不允许使用管道符号进行编写的方式,所以需要进行相应的处理。
$ cat grub.yml
- hosts: localhost
gather_facts: no
tasks:
- name: fuga
debug: var=filecontent
vars:
# filecontent: "{{ lookup('file', '/tmp/cmdline') }}"
filecontent: "{{ lookup('file', '/tmp/cmdline2') }}"
- name: hoge
shell: /bin/echo "file not much(ok)" >> /tmp/hoge/ttt.txt
# shell: /bin/echo "file much(ok)" >> /tmp/hoge/ttt.txt
when: filecontent is not search("transparent_hugepage")
vars:
# filecontent: "{{ lookup('file', '/tmp/cmdline') }}"
filecontent: "{{ lookup('file', '/tmp/cmdline2') }}"
$ cat /tmp/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-514.26.2.el7.x86_64 root=UUID=63eec43b-cebd-4fd0-b92f-5518d45cfb00 ro crashkernel=auto console=ttyS0,38400n8 transparent_hugepage=never
$ cat /tmp/cmdline2
$ ansible-playbook -c local grub.yml -vv
TASK [fuga] ************************************************************************************************************************************************
task path: /home/myuser1/myrepo/grub.yml:5
ok: [localhost] => {
"filecontent": ""
}
TASK [hoge] ************************************************************************************************************************************************
task path: /home/myuser1/myrepo/grub.yml:11
changed: [localhost] => {"changed": true, "cmd": "/bin/echo \"file not much(ok)\" >> /tmp/hoge/ttt.txt", "delta": "0:00:00.003179", "end": "2019-02-05 11:43:08.959428", "rc": 0, "start": "2019-02-05 11:43:08.956249", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
$ cat /tmp/hoge/ttt.txt
file not much(ok)
file much(ok)
file much(ok)
file not much(ok)
请参考以下链接获取相关信息:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html
https://docs.ansible.com/ansible/latest/user_guide/playbooks_lookups.html
https://confluence.sharuru07.jp/pages/viewpage.action?pageId=5898263
https://qiita.com/ryurock/items/639e5f7e49d25c3b6d75
顺便提一下,以下是关于重复消息的内容。
[DEPRECATION WARNING]: Using tests as filters is deprecated. Instead of using `result|search` use `result is search`. This feature will be removed in
version 2.9. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
在这个范围内,因为是用管道处理的,所以根据它写的话会出现上述的警告。
使用`stat`模块中的`register`参数的`with_items`的修正方法。
由于对于stat模块的register的with_items的修复方式有点困惑,所以我进行了单元测试,结果运行良好,以下是修复代码的片段。
如果只是普通的with_items列表,可以按照移植指南进行修复。
关键是要使用循环(loop)的方式。
$ cat disable.yml
- hosts: localhost
gather_facts: no
tasks:
- name: Check if log exists
stat:
path: "/tmp/hoge/{{ item }}"
loop:
- aaa
- bbb
- vvv
register: check_file
- name: debug check_registers
debug: var=check_file.results
- name: Disable Config
command: mv /tmp/hoge/{{ item.item }} /tmp/hoge/{{ item.item }}.org
when: item.stat.exists
loop: "{{ check_file.results }}"
$ ansible-playbook -c local disable.yml
请参考以下链接,详细了解如何在Ansible中使用循环时使用register参数:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html?highlight=register#using-register-with-a-loop
在以下链接中,有人提到了`with`和`loop`的区别。`flatten`的操作似乎有所不同。
Note: The given text is in Japanese, not Chinese. Here is the paraphrase in Chinese:
在此链接中,有人提到了 `with` 和 `loop` 之间的区别。`flatten` 的行为似乎不同。
- name: install httpd
yum:
- pkg: "{{ pkg_name }}"
+ pkg: "{{ item }}"
state: latest
+ loop: "{{ pkg_name | flatten(levels=1) }}"
+ vars:
+ pkg_name:
+ - "{{ packages1 }}"
+ - "{{ packages2 }}"
当忘记编写循环并引发了以下错误时,似乎将其称为“flatten”是指在需要将一些具有依赖关系的东西组合在一起时,批量输入它们的动作。
The error was: AttributeError: 'list' object has no attribute 'endswith'
追加内容:当想要判断目录或符号链接等stat是否存在时出现错误时,可以尝试查看是否已经定义,这样就不会产生错误了。
- name: create Symbolic link
file:
src: /path_to_src_file
dest: /path_to_dest_file
state: link
when:
- not destfile1.stat.islink is defined