Ansible的多版本共存

我想試試新版本,或者根據舊版本進行調整以確保功能的正常運作,這是我的實驗紀錄。

如果你希望将其放置在本地用户环境的主目录中而不是全局环境中,你可以执行以下操作:
将export PATH=$HOME/.local/bin:$PATH的命令添加到~/.bashrc或其他类似文件中,并执行pip install ansible=2.0.0.2 –user命令,这样它将被优先读取。

以下是使用virtualenv的方法,如果使用Python 2.6,则无法正确安装virtualenvwrapper,但如果使用Python 2.7,则可以成功安装。
在CentOS 6上安装Python 2.7时,搜索得到的是从非base仓库进行安装的步骤。
另外,如果要迁移正在运行的Jenkins,可以按照以前的方法进行操作,大致如下。

安装pip和python-devel。

curl -kL https://bootstrap.pypa.io/get-pip.py | python
yum install python-devel

安装virtualenv。

pip install virtualenv
pip install virtualenvwrapper
find /usr -name virtualenvwrapper.sh
vi .bashrc
以下を追記
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/bin/virtualenvwrapper.sh
fi

source .bashrc

通过使用mkvirtualenv命令为每个版本创建环境,并使用workon命令指定环境名称进行切换。

mkvirtualenv ansible2.5
workon ansible2.5
pip install ansible
ansible --version
pip list|grep ansible

如果不指定环境名称,则会显示环境列表。

workon

创建一个适用于Ansible 2.0的环境并安装它。

mkvirtualenv ansible2.0
which ansible
pip install ansible==2.0
ansible --version

退出 virtualenv(提示符返回原始状态)。

deactivate

嗯,大致上就是说在执行ansible-playbook之前,需要使用”workon ansible2.0″命令,执行完之后再使用”deactivate”来取消激活。

我试过一下,发现在yum模块周围显示找不到yum模块的错误提示,所以我进行了以下切换操作,问题就解决了。

  - set_fact:
#      ansible_python_interpreter="/root/.virtualenvs/ansible2.0/bin/python"
      ansible_python_interpreter="/usr/bin/python"

  - name: install needed network manager libs
    yum:
      name: '{{ item }}'
      state: installed
    with_items:
      - NetworkManager-glib
      - nm-connection-editor.x86_64
      - libsemanage-python
      - policycoreutils-python

  - set_fact:
      ansible_python_interpreter="/root/.virtualenvs/ansible2.0/bin/python"

此外,当我想要仅使用正在开发的模块的新功能时,我向懂Python的人请教后得知可以通过gitclone进行复制或通过raw进行下载,然后将其放置在以下位置,就能够正常运行。例如,如果是nmcli,将其放置在这个位置似乎是不错的选择:
/usr/lib/python2.x/site-packages/ansible/modules/network/
如果使用virtualenv,以下位置可能更适合:
/root/.virtualenvs/ansible2.0/lib/python2.7/site-packages/ansible/

我尝试按照下面的方式添加playbook侧的条件分支,但在低版本中出现了语法错误,因为使用了不存在的模块名。真让人沮丧。似乎在2.0版本中根本不存在ansible_version.full。

有人在 Playbook 中撰写了有关如何指定版本的方法,我将其链接贴在这里。

- name: check systemd
  stat:
    path: /usr/bin/systemctl
  register: check_systemd

- name: set timezone to common_timezone(default value is Asia/Tokyo)
  timezone:
    name: "{{ common_timezone }}"
  when:
    - ansible_version.full >= '2.3'
    - check_systemd.stat.xusr

- block:
  - name: check if timezone is common_timezone
    command: /usr/bin/timedatectl status|grep -i 'time zone'|awk '{print $3}'
    register: check_timezone
    ignore_errors: true
    when: check_systemd.stat.xusr
  - name: set timezone to common_timezone
    command: /usr/bin/timedatectl set-timezone '{{ common_timezone }}'
    when: check_timezone != common_timezone
  when: ansible_version.full < '2.3'

由于某种原因,需要将在ansible2.4版本下编写的程序与2.0版本下无法运行的程序进行比较并确定特定部分。大致关注以下内容。

include_tasks ## -> include
import_tasks ## -> include
loop_controls,loop_vars ## -> with_items等に使うloop内の変数はitemのみ
replace: path ## ->dest
when:
  - check_result1.rc == 0 ## ansible2.4~ check_result1|succeeded
  - check_result2.rc == 1 ## ansible2.4~ check_result2|failed
yum: # enablerepoは2.0ではつかえず  

后来我觉得with_indexes和with_nested也没有正常工作(可能)

当出现以下情况时,可见出现了UnicodeDecodeError错误:无法对0xe3位置上的字节进行解码:该位置上的字节不在128范围内。换句话说,当执行检查任务失败且变量无法获取时,往往会出现这种错误。

所以,在仅需要获取shell或command的信息而不对环境进行操作的检查任务中,最好将以下内容全部包含进去:
always_run:是 ## ansible2.4~ checkmode:否

想不到的是,出现像0xe3这样的错误代码是Python错误,而不是Ansible错误。具体来说,据说是这个bug的原因。另外,版本号为0的补丁存在很多bug(语义化版本控制),因此最好使用稳定的版本(如果最新稳定版本在现有环境等方面很难使用,则可以使用最新的补丁版本等)。我听说,当遇到这种情况时,通过virtualenv使用不同的版本来确认,可以得到一个合法的语法错误,并且可以更容易地确定错误的位置。(还听说,通过在issue中搜索,可以找到大部分错误信息)

请参考以下链接,链接地址如下:

https://dev.classmethod.jp/server-side/ansible/select_ansible_version_via_virtualenv/

https://qiita.com/TatsuNet/items/7719ddcdf856de7cfc9a

广告
将在 10 秒后关闭
bannerAds